【发布时间】:2011-12-13 16:23:57
【问题描述】:
我对 C 编程比较陌生,很难理解整个内存分配问题。
假设,我愿意:
int *n = malloc(sizeof(char));
// (assuming malloc doesn't return NULL of course)
这提供了一个指向 int 的指针,但我没有为 int 分配足够的内存。为什么它会起作用?我什至可以将它显式地转换为 int 并且它不会打扰 gcc。我知道 C 编译器非常简约,但即使我为 *n 分配了一个值,它也不适合 char,例如:
*n = 300;
...然后打印出来:
printf("%d", *n);
...它工作得非常好,尽管最迟我预计会出现一些错误,例如分段错误。
我的意思是,sizeof(char) 在我的机器上是 1,而 sizeof(int) 是 4。因此 3 个字节被写入内存中的某个未正确分配的位置。
它只是因为它不离开堆栈而起作用吗?
有人能指点我一个地方,我可能会发现关于这些东西的启示吗?
【问题讨论】:
-
如果您遇到了段错误,请认为自己很幸运。没有段错误并不意味着你的代码很好,它只是意味着你被搞砸了,因为你没有得到任何迹象表明它是错误的......直到你切换编译器,编译器版本,架构等并且东西爆炸或给出错误的结果.可悲的是,很容易得到那种。
-
请注意,
sizeof (char)根据定义为 1(尽管这与您的问题并不特别相关)。sizeof产生的结果是多个字节,但一个字节被定义为char的大小(通常是 8 位,但可以更多)。
标签: c memory memory-management malloc