2017-02-26 60 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