2015-04-06 204 views
2

我正在寫一個程序從文件中讀取任意數量的行(其中第一行是我不需要的頭),併爲它們動態分配內存。malloc()內存損壞

char buffer[350]; 
char** addresses; 
char** temp; 
int i = 0; 
int check = 10; 

addresses = malloc(sizeof(char*) * check); /* let's start with 10 potential addresses */ 

if(addresses == NULL){ 
    printf("Unable to allocate memory.\n"); 
    exit(1);} 

fgets(buffer, sizeof(buffer), stdin); /* call this once to get past the header line */ 


while(fgets(buffer, sizeof(buffer), stdin) != NULL) 
{ 

    if(i > check) /* we need more memory */ 
    { 
     temp = realloc(addresses,(2*check)*sizeof(char*)); /* double the memory we have */ 
     if(temp == NULL) 
     { 
      printf("Unable to re-allocate memory"); 
      exit(1); 
     } 
     else 
     { 
      addresses = temp; 
      check *= 2; 
      printf("reallocating to %d\n", check); 
     }   
    } 

    addresses[i] = malloc(strlen(buffer)); /* get memory for number of chars in each line */ 
    printf("2 %d\n", i); 
    strcpy(addresses[i],buffer); 
    i++; 
} 

當我運行它,我得到一個內存破壞錯誤:

reallocating to 20 
reallocating to 40 
reallocating to 80 
reallocating to 160 
reallocating to 320 
reallocating to 640 
*** glibc detected *** ./a.out: malloc(): memory corruption:  0x0000000007721310 *** 
======= Backtrace: ========= 
/lib64/libc.so.6[0x37f0a71fbe] 
/lib64/libc.so.6(__libc_malloc+0x6e)[0x37f0a73dfe] 
./a.out[0x400789] 
/lib64/libc.so.6(__libc_start_main+0xf4)[0x37f0a1d9f4] 
./a.out[0x4005d9] 

這是什麼原因?

回答

2
addresses[i] = malloc(strlen(buffer)); /* get memory for number of chars in each line */ 
printf("2 %d\n", i); 
strcpy(addresses[i],buffer); 

您沒有爲終止的NUL字符分配空間。

+1

爲了解決這個問題,在'strlen'的結果中加'1'。或者使用'strdup'。 – 2015-04-06 07:03:25