【发布时间】:2012-01-18 15:54:34
【问题描述】:
首先我对 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)中读取数据到具有特定大小 strstr() 的 char 数组时会失败(我假设这是因为额外的垃圾)。使用指针和 malloc 的内存工作得很好。无论如何,我有几个具体的问题。
这个 malloc 变量的行为是预期的吗?这里是否进行了一些优化(我使用 gcc 编译,但没有进行任何优化)或者 gdb 没有向我显示所有内容?该变量是否应该存在“垃圾”?
我是否正确使用了 malloc?我应该初始化我请求的所有内存吗?如果有,怎么做?
谢谢!
编辑
感谢所有回复的人!我从你们那里学到了很多东西,非常感谢。我现在看到了我上面发布的代码的问题,以及我在使用 fgets() 和 strstr() 时遇到的原始问题。
【问题讨论】:
-
内存在分配时未填充空值。为此,请使用 memset(..)
-
@Adrian,不,不,不。这是
C。不要投射malloc(),也不要教C的新手这样做。 -
@DanFego 我也在学习我猜哈哈。我一直在投射mallocs。谢谢(你的)信息。我已经编辑了我的评论!
-
@Adrian 抱歉大喊大叫!我只是看到这里有这么多人建议,我不想认为我们也在教初学者这样做。 :P
-
@Adrian: Pre-C89,
malloc返回char *,所以在那个时候演员表是必要的,当然任何教程或参考资料都会显示出来。在 C89 中,malloc更改为返回void *,它可以隐式转换为任何对象指针类型,因此现在强制转换是多余的(实际上可能隐藏错误)。不幸的是,许多旧的参考资料没有更新以反映这种变化,而且这种做法一直存在。
标签: c