gpt4 book ai didi

c - malloc 上的段错误

转载 作者:行者123 更新时间:2023-11-30 17:52:59 26 4
gpt4 key购买 nike

运行此函数多次(不确定具体多少次)后,它会在简单的内存分配上出现段错误。为什么会突然发生这样的事情呢?我确实注意到 GDB 中有一些奇怪的东西。在调用它的函数中,wrd 通常有 6 位长的十六进制值(例如,wrd = 0x605140),但是在崩溃的调用中,十六进制值只有两位数长。 (wrd=0x21)。我还检查了wrd->length,它是3。

它崩溃的线路是...

char *word_temp = malloc(wrd->length * sizeof(char));

编辑:

这是创建wrd的代码...

while(fgets(input, 100, src) != 0)
{
int i = 0;
while(input[i] != '\0')
{
i++;
}

struct word *wrd = malloc(sizeof(struct word));
wrd->letters = input;
wrd->length = i;

如果出现溢出,我该如何解决?

最佳答案

看起来wrd->length不包括终止'\0'

修复 1,像这样分配 word_temp:

char *word_temp = malloc( wrd->length + 1 );

修复 2,通过修改长度计数循环来包含“\0”:

int i = 0;
while(input[i++] != '\0') {}

这将使 i 比问题中的代码多增加一次,如果您考虑 input 为空的情况,很容易看出这一点。

请注意,您需要执行修复 1 或修复 2,而不是同时执行两者。选择与您的其余代码兼容的选项。

<小时/>

您可能对这一行有第二个问题:

wrd->letters = input;

它不复制输入,而是复制指针。如果更改 input 的内容,wrd->letters 的内容也会更改,因为它们指向相同的内存位置。另外,如果 input 是本地 char 数组,那么一旦超出范围,wrd->letters 就会变成悬空指针,该指针将被其他数据覆盖,并且修改之后将导致内存损坏。

可能的修复(取决于代码的其余部分)是使用 strdup :

wrd->letters = strdup(input);

请记住,它现在是从堆中分配的,因此完成后,您必须记住执行以下操作

free(wrd->letters);
<小时/>

关于 wrd 为 0x21,这表明内存损坏,或者您实际上有两个单独的 wrd 变量,其中一个未初始化。

例如,也许wrd是一个函数参数struct word *wrd,在这种情况下,你只修改函数中的本地值,它不会被传回调用者,召集者。要修改调用者的指针,您需要有指向指针的指针:struct word **wrd,然后执行(*wrd) = malloc... (*wrd)->字母... 等等

关于c - malloc 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15881934/

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