gpt4 book ai didi

c - 动态二维数组崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 04:37:45 25 4
gpt4 key购买 nike

我正在从一个文件中读取(每行包含 1 个单词)并将每一行放入一个数组中。当它即将关闭文件时崩溃说(* glibc detected * proj: corrupted double-linked list: 0x0000000002139240 ***)。此外,除了第一个元素之外的所有内容都被正确复制(第一个元素应该是“你好吗”,但实际上是“0”)。非常感谢对此的任何帮助。

int i = -1;
int numb;
int wsize;
while (fgets(word,30,file)!=NULL)
{
if (i==-1)
{
if(word[strlen(word)-1]=='\n')
{
word[strlen(word)-1] = 0;
}
numb = atoi(word);
ptr = malloc(sizeof(char*)*numb);
}
else
{
if(word[strlen(word)-1]=='\n')
{
word[strlen(word)-1] = 0;
}
wsize = strlen(word);
ptr[i] = malloc(sizeof(char*)*wsize);
strncpy(ptr[i],word,strlen(word));
size++;
}
i++;
}
int j=0;
while(j<16) //prints to see if they were copied corectly
{ //ptr[0] was the only one that did not copy corectly
printf("%s\n",ptr[j]);
j++;
}
fclose(file);
printf("test\n"); //was never printed so I assume it crashes at fclose()
return 1;

最佳答案

ptr[i] = malloc(sizeof(char*)*wsize);是错误的,原因有二:

  1. 应该是sizeof(char) , 不是 sizeof(char*) (或者忽略这个,因为根据定义 sizeof(char) 等于 1)

  2. 如果要存储长度为wsize的字符串, 你需要分配 wsize+1字节数

编辑——更多问题:

  1. size++; 这行的用途是什么? ?你是说 wsize++; ?

  2. while(j<16) 中的数字 16 从何而来? ?我建议你试试 while(j<i)相反。

  3. 如果 main()返回一个非零值,这表示发生了错误。将其更改为 return 0;除非您有充分的理由返回其他值。

还有一个:

  1. 我刚刚注意到您正在使用 strncpy() .这不会添加终止 '\0'字节到字符串的末尾,因为您要求它复制长度为 wsize 的字符串使用不超过 wsize字节。将此行更改为 strcpy(ptr[i],word);它应该有效。

完成后,您需要从代码中删除所有潜在的缓冲区溢出。 (有很多。)

关于c - 动态二维数组崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29381261/

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