gpt4 book ai didi

c - malloc 的指针将自身重置为 NULL?

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

我在使用 malloc 时遇到了一些非常奇怪的行为。我从来没有分配超过 4kB,所以这对我来说似乎特别奇怪。我的 main 看起来像:

int main(int argc, char **argv)
{
char *buf;
char *raw = malloc(1024);
fgets(raw, 1024, stdin);

parse(raw, &buf); // Process raw input, get parse length

printf("raw: 0x%p\n", raw); // Outputs 0x00000000

if(raw != NULL)
{ // Only prints when less than 10 characters are entered
free(raw);
printf("raw is not NULL\n");
}
free(buf);
return 0;
}

当我输入少于 10 个字符时,一切正常,当我正好输入 10 个字符时,出现段错误,而当我输入超过 10 个字符时,输出显示 raw 为 NULL。应该注意的是 raw 的大小是 1024 个 malloc 字节,所以我应该有更多的空间来处理。

解析函数为:

int parse(char *src, char **dst)
{
int num_valid = 0, len = strlen(src), j = 0;

// Count number of valid characters
for(int i = 0; i < len; i++)
{
if(src[i] == 'A')
++num_valid;
}

*dst = malloc(num_valid);

for(int i = 0; i < len; i++)
{
if(src[i] == 'A')
*dst[j++] = src[i];
}

// For debugging:
printf("src: 0x%p\n", src); // outputs correct address

return num_valid;
}

该函数输出正确的地址,并正确分配和填充dst。我在这里稍微修改了代码,这基本上是我的代码的一个非常简化的形式。我编译并运行它 (gcc test.c -Werror -Wall),结果相同。只有在这个函数返回后,我的原始指针才变为 NULL,或者我得到一个段错误。

有人能指出我正确的方向吗?告诉我我到底做错了什么?从昨天开始我就一直在调试这段代码,它快把我逼疯了。

最佳答案

这并不代表你认为的意思:

*dst[j++] = src[i];

你的意思是

(*dst)[j++] = src[i];

你写的是什么意思:

*(dst[j++]) = src[i];

dst[1] 是变量 buf 之后发生的任何事情,因此您正在使用来自随机内存位置的地址并覆盖它可能指向的任何内容;那是未定义的行为。

正如@pm100 在评论中指出的那样,将缓冲区保存在临时变量中通常是更好的风格:

char* buf = malloc(num_valid);
if (!buf) { /* Handle allocation failure */ }
*dst = buf;
/* ... */
/* In loop */
buf[j++] = src[i];

关于c - malloc 的指针将自身重置为 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40047239/

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