C - char 的内存大小指针

C - Memory size pointer of char

我正在尝试编写一个函数来将文本输入分配给 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 没有足够的 space。但是由于一个字符的大小是一个,而且我使用了 sizeof(char*) 我不明白它是不够的。我需要分配多少内存,为什么它在我的第一个示例中有效?谢谢!

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 已分配,但它的 none 个元素已被初始化。如果指针为空,realloc 将像 malloc 一样工作,但如果它要求重新分配 input[i-1] 中未初始化的垃圾指针,它将变得异常。

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

Valgrind 等内存检查工具将有助于发现此类错误。