2011-01-21 6 views
1

다차원 배열에 데이터를 쓰려고 시도한 다음 배열을 const char**으로 다른 함수로 전달합니다. char*이 선언 된 함수에서 로컬로 인쇄하면 모든 것이 예상대로 작동합니다. 그러나 다른 함수에서 char*의 배열을 인쇄하려고하면 모두 빈 문자열입니다. 이것은 다음과 같은 출력 결과다차원 문자 배열이 함수 내에서 인쇄되지만 다른 함수로 전달되지 않습니다.

void my_print (const char** lines, unsigned int num) 
{ 
    int i = 0; 

    for (i = 0; i < num; i++) { 
     fprintf(stderr, "lines[%d]: %s", i, lines[i]); 
    } 
} 

void my_func() 
{ 
    char cfg[2][200]; 
    unsigned int value = 5; 

    snprintf(cfg[0], 200, "one two three\n"); 
    snprintf(cfg[1], 200, "my value = %u\n", value); 

    fprintf(stderr, "lines[0] = %slines[1] = %s\n", cfg[0], cfg[1]); 

    my_print((const char**) cfg, 2); 
} 

:

나는 다음과 같은 코드를 사용하고

void my_func() 
{ 
    char* cfg[2]; 
    unsigned int value = 5; 

    cfg[0] = malloc(200); 
    cfg[1] = malloc(200); 
    snprintf(cfg[0], 200, "one two three\n"); 
    snprintf(cfg[1], 200, "my value = %u\n", value); 

    fprintf(stderr, "lines[0] = %slines[1] = %s\n", cfg[0], cfg[1]); 

    my_print((const char**) cfg, 2); 
} 
:

lines[0] = one two three 
lines[1] = my value = 5 
lines[0]: 
lines[1]: 

대신 경우, 지정된 my_func의를, 나는 다음과 같은 사용

그러면 모든 것이 작동하고 다음과 같이 표시됩니다.

lines[0] = one two three 
lines[1] = my value = 5 
lines[0]: one two three 
lines[1]: my value = 5 

여기 백그라운드에서 무엇이 일어나고 있습니까? my_print이 내 문자열을 인쇄 할 수 있도록하려면 왜 malloc을 사용해야합니까?

감사합니다 당신이

답변

6

배열은 포인터

배열 그들의 첫 번째 요소에 대한 포인터로 붕괴 아니지만, 그게 단지 처음 차원에서 발생합니다. 그래서 2 차원 배열 포인터에 대한 포인터로 하지 부패가하는 즉, 그래서 그것은 단지 당신이 함수에 전달해야하는지, 배열에 대한 포인터로 붕괴 :

// lines is of type "pointer to array 200 of const char" 
void my_print (const char (*lines)[200], unsigned int num) 

코드 행은 매우입니다 매우 잘못 :

my_print((const char**) cfg, 2); 

당신은 아마 컴파일러 침묵 const char**에 캐스트를 삽입했다. 이 아닌을 수행하십시오 - 컴파일러가 잘못된 것을하고 있다고 말하려고합니다! 종료하는 것은 잘못된 행동입니다.

my_print(cfg, 2); 
+0

2D 배열이 포인터에 대한 포인터로 부패하지 않는다는 사실이 답이었습니다. 감사! – DuneBug

0

주어진 설명이 좋다 : 포인터에 포인터는 하지 다차원 배열과 같은 일이 my_print의 정의 위의 변화와 함께, 당신은 어떤 캐스트가 필요하지 않습니다. 노골적 설명

구문으로 2 차원 배열

숯 CFG [2] [200];

은 인접한 메모리 셀에 할당되는 것이 보장된다. malloc으로 할당 된 2 차원 포인터 포인터 배열은 이 아니며 인접한 메모리 셀에이 할당되지 않으면 힙 전체에 할당됩니다. malloc을 호출 할 때마다 새 세그먼트를 할당하기 때문입니다. C로 인해 다차원 배열을위한 일반적인 함수를 만드는 것은 매우 까다 롭습니다.

관련 문제