gpt4 book ai didi

c - Malloc 与特定大小的字符数组

转载 作者:太空狗 更新时间:2023-10-29 15:16:45 25 4
gpt4 key购买 nike

首先,我是 C 的新手,所以我可能对这里有一个根本性的误解。给定这样的代码:

int main()
{
char ack[100];
char *bar;
bar = malloc(100);
strncpy(ack, "testing", 7);
bar = "testing";

return 0;
}

ack 当被 gdb 检查时看起来像这样:

(gdb) p ack
$1 = "testing\000\360WV\000\000\000\000\000\277\000\000\000\000\000\000
'\000'\000\220\005@",<repeats 13 times>, "\003\004@", '\000' <repeats 13 times>
"\325,\005@\000\000\000\000\000H\214\246\367\377\177\000\000\220\005@",
'\000' <repeats 13 times>, "P\004@\000\000\000\000\000\360\342\377\377"`

考虑到我如何初始化 ack,这对我来说很有意义。我不太明白的是为什么 bar 看起来像这样:

(gdb) p bar
$2 = 0x40066c "testing"

我分配了与为 ack 请求空间时相同的存储量(据我所知),但 malloc 没有多余的垃圾。据我了解,malloc 不进行任何类型的数据初始化或任何操作,所以我有点困惑。出现这种情况的原因是我在使用 strstr 时遇到的问题。基本上,当我从文件 (fgets) 读取数据到具有特定大小的 char 数组时,strstr() 会失败(我假设这是因为额外的垃圾)。使用指针和 malloc 的内存工作得很好。不管怎样,我有几个具体问题。

  1. 这个 malloc 变量的行为是否符合预期?这里是否进行了一些优化(我用 gcc 编译,但没有做任何优化)或者 gdb 没有向我显示所有内容?是否应该有与该变量关联的“垃圾”?

  2. 我是否正确使用了 malloc?我应该初始化我请求的所有内存吗?如果是,怎么办?

谢谢!

编辑

感谢所有回复的人!我从你们那里学到了很多东西,非常感谢。我现在看到了上面发布的代码的问题,以及我在使用 fgets() 和 strstr() 时遇到的原始问题。

最佳答案

bar = "testing";

重新分配指针 bar 以指向包含字符串 "testing" 的静态缓冲区,即它不再指向您的malloc 数组。这是 memory leak .

要将字符串放入 malloc 的缓冲区,请使用 strcpystrncpymemcpy,例如你用 ack 做了。

关于c - Malloc 与特定大小的字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8913150/

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