2010-07-06 54 views
2

我有下面的代碼重新分配一個二維字符數組

int wordLenght = 256, arrayLength = 2, i = 0, counter = 0; 
char **stringArray = NULL; 

stringArray = calloc(arrayLength, sizeof(*stringArray)); 

for(counter; counter<wordLenght; counter++) 
    stringArray[counter] = calloc(wordLenght, sizeof(stringArray)); 

while(1) 
{ 
    printf("Input: "); 
    fgets(stringArray[i], wordLenght, stdin); 

    printf("stringArray[%d]: %s\n", i, stringArray[i]); 

    if(i == arrayLength) 
    { 
    printf("Reallocation !!!\n"); 
    arrayLength *= 2; 

    stringArray = realloc(stringArray, arrayLength*sizeof(*stringArray)); 

    } 

    i++; 
}  

我得到這個再分配錯誤:

*** glibc detected *** ./stringArray: realloc(): invalid next size: 0x0000000000b49010 *** 
======= Backtrace: ========= 
/lib/libc.so.6(+0x775b6)[0x7f4dd12565b6] 
/lib/libc.so.6(+0x7dd66)[0x7f4dd125cd66] 
/lib/libc.so.6(realloc+0xf0)[0x7f4dd125d080] 
./stringArray[0x4007f9] 
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f4dd11fdc4d] 
./stringArray[0x400629] 

什麼這裏是我的問題???

謝謝,迎接

回答

2
stringArray = calloc(arrayLength, sizeof(*stringArray)); 

在這裏,你可能想使用sizeof(字符*)

for(counter; counter<wordLenght; counter++) stringArray[counter] = calloc(wordLenght, sizeof(stringArray)); 

在這裏,你是循環256次(wordLenght),但你應該只有2次(arrayLength)。此外,您可能想使用sizeof(char)而不是sizeof(stringArray)。

if(i == arrayLength) {...} 

這個檢查應該在你調用fgets之前完成,因爲你現在先使用內存然後再分配它們。

此外,您重新分配字符串數組後,您需要分配使用的東西串的其餘部分是這樣

for(counter = i; counter<arrayLength; counter++) stringArray[counter] = (char*)calloc(wordLenght, sizeof(char)); 

最後,你需要釋放所有分配的內存退出應用程序之前。

+0

+1因爲我錯過了(i == arrayLength) – 2010-07-06 13:45:30

+0

非常感謝!現在它工作正常;-) – leon22 2010-07-06 15:44:36

+0

然後將其標記爲答案,並感謝您的問題:) – 2010-07-06 18:17:14

2

你可能並不意味着sizeof(*stringArray)

事實上,我相信你可能想在calloc呼籲重新審視過,我覺得你有分配指針的大小(字長度時間)。

+0

每行一次分配是製作多維數組的一種可怕方法。您應該將其分配爲一個塊,並自己執行偏移量算法(始終可能),或者聲明適當的可變長度數組指針類型(僅限C99)。 – 2010-07-06 13:17:35

+1

他可能確實意味着sizeof(* stringArray)。 stringArray是一個指向char的指針數組,這就是每次空間耗盡時擴大到兩倍大小的內容。但是你對'stringArray [counter] = calloc(wordLenght,sizeof(stringArray));''調用。 – 2010-07-06 13:31:39

0

後的第一次此行執行:

stringArray = realloc(stringArray, arrayLength*sizeof(*stringArray)); 

然後字符串數組[arrayLength/2]將是一個垃圾值 - 你沒有把它設置爲指向存儲的單詞。

這部分應該使用使用sizeof(**字符串數組),或1作爲**字符串數組是炭,並且計數器只應上去arrayLength:

for(counter; counter<wordLenght; counter++) 
    stringArray[counter] = calloc(wordLenght, sizeof(stringArray)); 

在一個塊中而不是分配:

char* block = malloc(wordLength * arrayLength); 

for (counter; counter < arrayLength; ++counter) 
    stringArray[counter] = block + (counter * wordLength); 

目前,它可能是有字符串數組後一些空間,要在其中存儲(字長-arrayLength)額外的指針,當你釋放calloc他們和realloc不動字符串數組。

這是很可能的0xb49010是你calloc'd的指針之一,而你在那裏覆蓋的malloc保持其塊大小的內存..

但是既然你註銷字符串數組的結束,無論如何,你都陷入了未定義的行爲。

0

確定這裏是整個解決方案:

int wordLength = 256, arrayLength = 2, i = 0, counter = 0; 
    char **stringArray = NULL; 
    char buffer[wordLength]; 

    stringArray = calloc(arrayLength, sizeof(char*)); 
    for(counter; counter<arrayLength; counter++) stringArray[counter] = (char*)calloc(wordLength, sizeof(char)); 

    while(1) 
    { 
     if(i == arrayLength) 
     { 
      printf("Reallocation !!!\n"); 
      arrayLength *= 2; 

      stringArray = realloc(stringArray, arrayLength*sizeof(char*)); 
      for(counter = i; counter<arrayLength; counter++) stringArray[counter] = (char*)calloc(wordLength, sizeof(char)); 
     } 

     printf("Input: "); 
     fgets(buffer, wordLength, stdin); 

     if(!strcmp(buffer,"q\n")) break; // also free here  
     else stringArray[i] = buffer; 

     printf("stringArray[%d]: %s\n", i, stringArray[i]); 

     i++; 
    } 

是如何釋放空間的最佳方式!