2012-04-30 5 views
0

함수를 사용하여 문자열 배열을 재 할당하고 싶습니다. 여기에 설명 할 아주 간단한 프로그램을 쓴다. 나는 편지 "b"가 출력 되길 기대하지만 나는 NULL을 얻는다.C : 문자열의 배열을 다시 할당하십시오.

void gain_memory(char ***ptr) { 
    *ptr = (char **) realloc(*ptr, sizeof(char*) * 2); 
    *ptr[1] = "b\0"; 
} 

int main() 
{ 
    char **ptr = malloc(sizeof(char*)); 
    gain_memory(&ptr); 
    printf("%s", ptr[1]); // get NULL instead of "b" 
    return 0; 
} 

대단히 감사합니다.

+1

'realloc '의 반환 값을 캐스트하지 마십시오. 이것은 결국 C입니다. (그렇게하면 컴파일러가 다르게 알려주는 문제를 숨길 수 있습니다.) –

+0

또한 재 할당하려는 포인터에 즉시'realloc'의 결과를 할당하지 마십시오. 'realloc'이 실패하면 원래의 포인터를 잃어 버리고 메모리가 유실되었습니다. (아, 할당 실패 여부도 확인하십시오.) – jamesdlin

답변

0

당신은 gain_memory에 *의 PTR 괄호를 넣어해야합니다 당신은 문자열의 배열의 실제 문자열에 대한 메모리를 할당하지 않는

(*ptr)[1] = "b\0"; 
0

을, 당신은 같은 것을 할 필요가 :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void gain_memory(char ***ptr, int elem) { 
    *ptr = (char**)realloc(*ptr, 2*elem*sizeof(char*)); 
    (*ptr)[1] = "b"; 
} 

int main() 
{ 
    //How many strings in your array? 
    //Lets say we want 10 strings 
    int elem = 10; 
    char **ptr = malloc(sizeof(char*) * elem); 
    //Now we allocate memory for each string 
    for(int i = 0; i < elem; i++) 
     //Lets say we allocate 255 characters for each string 
     //plus one for the final '\0' 
     ptr[i] = malloc(sizeof(char) * 256); 

    //Now we grow the array 
    gain_memory(&ptr, elem); 
    printf("%s", ptr[1]); 
    return 0; 
} 
+0

그는 포인터 중 하나에 상수 문자열 만 지정하기 때문에 예제에서 실제 문자열에 메모리를 할당 할 필요가 없습니다. – JeremyP

3

[] 연산자는 *보다 우선 순위가 높으므로이 코드를 변경하면 올바르게 작동합니다.

(*ptr)[1] = "b"; 

P. "\ 0"은 불필요합니다.

관련 문제