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 等内存检查工具将有助于发现此类错误。
我正在尝试编写一个函数来将文本输入分配给 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 等内存检查工具将有助于发现此类错误。