C - char

时间:2017-02-26 19:08:17

标签: c memory-management dynamic-memory-allocation

我正在尝试编写一个函数来将文本输入分配给char**。每个单词存储在char*中。当我这样做的时候,我遇到了错误,我认为我没有分配足够的内存,所以我写了一个小测试程序。

#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*)我不知道它是不够的。我需要分配多少内存,为什么它在我的第一个例子中有效?谢谢!

1 个答案:

答案 0 :(得分: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]中重新分配未初始化的垃圾指针,它将会发疯。

相反,您必须在尝试input其元素之前正确初始化realloc

诸如Valgrind之类的内存检查工具将有助于发现这些错误。