gpt4 book ai didi

c - 无效读取 - Valgrind 和 C

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:58 24 4
gpt4 key购买 nike

C 和 Valgrind 以及手动内存管理的新手,我无法找到运行 Valgrind 时遇到的错误。我有这个函数可以从用户那里获取字符串:

char **get_fragments_from_user(){
// No more than 20k strings containing at most 1k characters
char **strings = malloc(20000 * sizeof(char *));

char tempstring[MAX_INPUT]; //MAX_INPUT = 1001
int count = 0;
while(true){
printf("\n> ");
fgets(tempstring, MAX_INPUT, stdin);
if((strlen(tempstring) > 0) && (tempstring[strlen(tempstring) - 1] == '\n')){
tempstring[strlen(tempstring) - 1] = '\0';
}
if(tempstring[0] == 'q') break;
strings[count] = malloc(sizeof(char) * (strlen(tempstring)+1));
strcpy(strings[count], tempstring);
count++;
}
int i = 0;
char **fstrings = malloc((count)*sizeof(char *)); // count+1 needed? Something I tried removing while debugging
for(i = 0; i < count; i++){
fstrings[i] = malloc(sizeof(char) * (strlen(strings[i])+1));
strcpy(fstrings[i], strings[i]);
free(strings[i]);
}
free(strings);
return fstrings;
}

这里的想法只是获取字符串并将它们放入数组中。我最初分配了一个足够大的数组以容纳可以输入的最大字符串数 (20,000),但随后我调整了该数组的大小,以便我分配的内存不会超过每个字符串所需的内存。上面的代码让我有点尴尬,因为它比我用另一种语言编写的任何代码都不够干净,但这是我第一次通过。

当我尝试使用此函数计算数组中的字符串数时,我从 Valgrind 得到“大小为 8 的无效读取”:

int lengthOf(char **arr){
int i = 0;
while(arr[i] != NULL){
i++;
}
return i;
}

我很确定这是由于取消引用的指针或其他原因造成的,但我一直找不到它,而且我已经查看这段代码大约一个小时了。

最佳答案

所以,我认为问题在于我没有分配足够的内存来存储整个数组。

而不是做:

malloc(count * sizeof(char *));

我应该分配 count+1,所以要么:

malloc((count + 1) * sizeof(char *))

calloc((count + 1), sizeof(char *));

关于c - 无效读取 - Valgrind 和 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25559777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com