2009-11-24 2 views
30

나는 특히이 같은 사소한 무언가를 위해 malloc에이겠습니까 문자 포인터언제 문자 포인터

char *ptr; 
ptr = "something"; 
...code... 
...code... 
ptr = "something else"; 

에서의 malloc을 사용하는 경우에 초점을 맞추고있어위한 malloc을 사용 하는가? 그렇다면 왜? 그렇지 않다면, 숯불 포인터는 언제 필요합니까?

답변

30

을 수행 할 수 있습니다, 당신은 할의 malloc를 사용할 필요가 없습니다 : 그 이유는 정확히

const char *foo = "bar"; 

입니다

*foo 포인터 —을입니다 foo을 초기화하면 문자열의 사본을 만들지 않고 실행 파일의 데이터 섹션에 "bar"이있는 위치의 포인터 만 만들 수 있습니다. 포인터를 원하는만큼 자주 복사 할 수는 있지만 항상 그 문자열의 동일한 단일 인스턴스를 가리키고 있음을 기억하십시오.

언제 malloc을 사용해야합니까? 일반적으로 strdup()을 사용하여 백그라운드에서 malloc을 처리하는 문자열을 복사합니다. 예 :

const char *foo = "bar"; 
char *bar = strdup(foo); /* now contains a new copy of "bar" */ 
printf("%s\n", bar);  /* prints "bar" */ 
free(bar);    /* frees memory created by strdup */ 

이제, 우리는 마침내 당신이 더 안전하게, 또는/새로운 문자열의 형식을 만들어 snprintf()sprintf()를 사용하는 경우 malloc을 할 수있는 경우에 주변에 얻을. 문자열의 크기는 컴파일 시간에 부정이됩니다

char *foo = malloc(sizeof(char) * 1024);  /* buffer for 1024 chars */ 
snprintf(foo, 1024, "%s - %s\n", "foo", "bar"); /* puts "foo - bar\n" in foo */ 
printf(foo);         /* prints "foo - bar" */ 
free(foo);          /* frees mem from malloc */ 
+0

무엇이 잘못 될지 : char * foo = "bar"; char * bar = foo; printf ("% s \ n", 막대); – ZPS

+1

먼저, 그것은'const char * foo ... '이어야합니다.', 두 번째로, 데이터가 아니라 포인터를 복사하는 예제입니다. 'strdup()'는 실제로 데이터를 복사한다. – scotchi

+0

malloc의 결과를'(char *)'에 캐스팅하는 편집이 제안되었습니다. 이것은이 코드가 C++에서 사용될 때 필요하지만 일반적으로이 코드 *는 C++에서 사용해서는 안되므로 편집을 되 돌리십시오. – scotchi

9

malloc은 무료 저장소에 메모리를 할당하기위한 것입니다. 당신이 다음을 수정하지 않는 문자열 리터럴이 있으면 괜찮 :

char *literal = "foo"; 

그러나 입력 등의 라인을 잡고, 수정 버퍼로 사용 할 수 있도록하려면 malloc 사용에 : 당신은 컴파일 시간에 필요한 메모리의 양을 모르는

char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */ 
// ... 
free(buf); 
4

사용 malloc(). 읽기 전용 문자열이있는 경우 const char* str = "something";을 사용할 수 있습니다. 문자열은 대부분 읽기 전용 메모리 위치에 저장되며 수정할 수 없습니다. 반면에 컴파일러 시간 동안 문자열을 알고 있다면 다음과 같이 할 수 있습니다 : char str[10]; strcpy(str, "Something"); 여기서 메모리는 스택에서 할당되고 str을 수정할 수 있습니다. 세 번째 경우는 malloc을 사용하여 할당하는 것입니다. 컴파일 시간 동안 문자열의 길이를 알지 못한다고 가정 해 보겠습니다. 다른 사람에 의해 지시 된대로 그런 다음 char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);

1

매번 당신의 malloc (또는 equiviallent 방법)으로 메모리를 할당해야합니다. 귀하의 경우에는 컴파일 타임 (sizeof ("something") 및 sizeof ("something else"))에서 문자열의 크기를 알 수 있습니다.

2

단일 문자 또는 정수의 경우 malloc이고 동적 배열의 경우 calloc입니다. 즉 pointer = ((int *)malloc(sizeof(int)) == NULL), 당신은 malloc의 괄호 안에 연산을 수행 할 수 있지만, 당신은 당신이 즉, 저장 계산과 데이터의 크기, 즉 원하는 얼마나 많은 항목 의미 void calloc(count, size)의 정의가 calloc를 사용해야하기 때문에 당신은 야해 int, char