2011-11-09 1 views
-1

여기 정말 간단한 C 프로그램의 충돌 유지하고 충돌하는 이유는 단지 알아낼 수 없습니다 :동적 배열 코드는

int main() { 

    size_t argc = 2; 
    char **argv = malloc(argc * sizeof(char *)); 
    for (int i = 0; i < 20; i++) { 
     if (i >= argc) { 
      argc *= 2; 
      argv = realloc(argv, argc); 
     } 
     argv[i] = strdup("hello world!"); 
    } 

    for (int i = 0; i < 20; i++) { 
     printf("argv[%d] = \"%s\"\n", i, argv[i]); // it crashes on this line 
     free(argv[i]); 
    } 

    free(argv); 
} 
+0

지원 질문 :( –

답변

6
 argv = realloc(argv, argc); 

크기가 잘못; 대신 argc * sizeof(*argv)이 필요합니다.

+0

감사합니다, 나도 몰라를 왜 내가 그것을 놓쳤는 지. 나는 그것이 어리석은 무엇인가이어야했다라는 것을 알고 있었다! – ryyst

3

당신이 realloc을 할 때, 당신은 N 개의 문자 대신 N 개의 문자를위한 공간을 할당 할 것입니다.

그럼에도 불구하고 어쨌든 20 개 항목의 공간을 원한다면 20 개 항목의 공간을 할당하고 데이터를 저장 한 다음 시작하는 것이 어떻습니까?

#define size 20 
char **argv = malloc(size * sizeof(char *)); 
if (argv == NULL) { 
    fprintf(stderr, "Allocation failed!"); 
    return 1; 
} 
for (int i=0; i<size; i++) 
    argv[i] = strdup("hello world!"); 

또한 realloc이/실패의 경우에 널 포인터를 반환 할 수 있습니다, 그래서 당신은 일반적으로 같은 싶지 :

char **temp = realloc(old_ptr, new_size); 
if (temp != NULL) 
    old_ptr = temp;