首先,我对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'd内存正常工作。无论如何,我有几个特定的问题。
- 这个malloc的变量的行为是否符合预期?这里是否进行了某些优化(我使用gcc编译,但没有进行任何优化),还是gdb没有显示给我所有内容?该变量是否应该有“垃圾”?
- 我使用malloc正确吗?我是否应该初始化我请求的所有内存?如果是,请问如何初始化?
编辑 感谢所有回答我的人!我从你们那里学到了很多东西,非常感谢。我现在看到了我上面发布的代码的问题,以及我在使用fgets()和strstr()时遇到的原始问题。
malloc()
强制转换,并且不要教新手在C中这样做。 - Dan Fegomalloc
返回的是char *
,所以在那些年代,强制转换是必要的。当然,任何当时编写的教程或参考资料都会显示这一点。随着 C89 的到来,malloc
被改为返回void *
,可以隐式地转换为任何对象指针类型,因此强制转换现在是多余的(实际上可能会隐藏错误)。不幸的是,许多旧的参考资料没有更新以反映这一变化,并且这种做法仍然存在。 - John Bode