2017-02-26 91 views
2

我正在嘗試編寫一個函數來將文本輸入分配給char**。每個單詞存儲在char*中。當我這樣做時,我收到了錯誤,我認爲我沒有分配足夠的內存,所以我寫了一個小測試程序。C - 字符的內存大小指針

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char **input=NULL; 
    char **help=NULL; 
    for(int i=1;i<300;i++){ 
     help=realloc(input,i*(sizeof(char*))); 
     if (!help) 
      return 0; 
     input=help; 
     input[i]="test"; 
    } 
    return 1; 
} 

現在這工作得很好,但是當我給每個字符分配如下。

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char **input=NULL; 
    char **help=NULL; 
    char *help2=NULL; 
    for(int i=1;i<300;i++){ 
     help=realloc(input,i*(sizeof(char*))); 
     if (!help) 
      return 0; 
     input=help; 
     for (int j=1;j<5;j++){ 
      help2=realloc(input[i-1],j); 
      if (!help2) 
       return 0; 
      input[i-1]=help2; 
      input[i-1][j-1]='t';  
     } 
    } 
    return 1; 
} 

我得到了第14行的段錯誤。我認爲這是因爲input沒有足夠的空間。但由於字符的大小是一個,我用sizeof(char*)我看不出它是不夠的。我需要分配多少內存,爲什麼在我的第一個例子中工作?謝謝!

+0

不能保證你在外部指針數組的初始'realloc'中留出空間的指針實際上是* determinate *。將它傳遞給* inner *循環中的'realloc'是未定義行爲的理由。總之,對於'realloc(input [i-1],j)'input [i-1]的初始值是不確定的;使用它有*壞*。 – WhozCraig

回答

1

clang馬上發現問題。

test(72707,0x7fffe32443c0) malloc: *** error for object 0x7fffe0051090: pointer being realloc'd was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

問題在這裏。

help2=realloc(input[i-1],j); 

儘管input已被分配,但其元素沒有被初始化。如果指針爲空,則realloc的行爲將與malloc相似,但如果其要求在input[i-1]中重新分配未初始化的垃圾指針,它將會變形。

相反,您必須在嘗試realloc其元素之前正確初始化input

內存檢查工具,如Valgrind將幫助找到這些類型的錯誤。

+1

Iow,在'input = help;'之後,把'input [i-1] = NULL;' – WhozCraig

+0

謝謝你解決了這個問題! – Roxor9999