2014-03-24 3 views
3

나는 2 차원 문자 배열을 할당하기 위해 노력하고있어이 코드를 사용하여, ary[i][j]처럼 액세스 할 수 있도록 : 불행하게도c : 2d char 배열을 동적으로 할당 할 때 문제가 발생합니까?

#define stringmaxlen 20 

void do_alloc(char ***vals, int valscount){ 
    *vals = (char**) calloc(sizeof(char**), valscount); 
    int i = 0; 
    for (; i<valscount; i++) 
     *vals[i] = (char*) calloc(sizeof(char*), stringmaxlen); 
} 

int main(){ 
    //...... 
    char** ary; 
    do_alloc(&ary, 10); 
    strcpy(ary[0], "test"); 
    //...... 
} 

가이 어딘가에 오버 플로우가 발생하고 프로그램이 실행에 버그가를, 나는 일부 참조를 가지고 동적 할당은 여기 http://staff.science.nus.edu.sg/~phywjs/CZ1102/lecture20/sld014.htm입니다.

나는 무엇이 문제인지 여기에서 어떻게 문제를 해결하는지 알고 싶습니다. 감사합니다.

+0

[calloc]에 사용하는 매개 변수는 [here] (http://www.cplusplus.com/reference/cstdlib/calloc/) 및 [there] (http : //)에서 볼 수있는 것과 반대 순서입니다. msdn.microsoft.com/en-us/library/3f8w183e.aspx); 나는 그것이 잘못된 행동을 일으킬 것인지 실제로 알지는 못한다. – ThoAppelsin

+1

@ThoAppelsin 'calloc'에 대한 매개 변수의 순서는 내가 아는 모든 플랫폼과 관련이 없습니다. – cmaster

답변

7

연산자 우선 순위가 잘못되었습니다. *vals[i](*vals)[i]이 아닌 *(vals[i])으로 평가됩니다. 자세한 내용은 http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence을 참조하십시오.

*vals[i](*vals)[i]으로 수정해야합니다.

또한 *vals[i] = (char*) calloc(sizeof(char*), stringmaxlen); 할당이 잘못되었습니다. stringmaxlen포인터에 포인터를 할당하기 때문에 너무 많은 메모리를 할당하지만, stringmaxlen 문자 만 있으면됩니다.

+0

예! 이제 문제는 해결되었습니다. 정밀도가 중요합니다! 고마워요! – user3457200

3

cmaster의 답변에 다음을 추가하고 싶습니다.

대신

*vals = (char**) calloc(sizeof(char**), valscount); 

사용

*vals = (char**) calloc(sizeof(char*), valscount); 

대신

(*vals)[i] = (char*) calloc(sizeof(char*), stringmaxlen); 

사용

(*vals)[i] = (char*) calloc(sizeof(char), stringmaxlen); 

첫 번째 경우 sizeof(char**)sizeof(char*)과 같기 때문에 할당 된 메모리 크기는 변경되지 않습니다. 그러나 두 번째 경우에는 그렇지 않습니다. sizeof(char)은 1이고 sizeof(char*)이 더 큽니다. 32 비트 하드웨어의 경우 4 개, 64 비트 하드웨어의 경우 8 개입니다.

더 중요한 것은, 문자에 대한 stringmaxlen 포인터가 아닌 stringmaxlen 문자의 메모리를 할당하려는 의도를 분명히합니다.

+1

관용구를 사용하면 이러한 오류를 피할 수 있습니다.'P = calloc (N, sizeof * P);'. '* vals = calloc (valscount, sizeof ** vals); 등. –

+0

@MattMcNabb 좋은 이디엄을 따라야합니다. –