gpt4 book ai didi

c - 为某种类型分配更少的空间?

转载 作者:太空狗 更新时间:2023-10-29 14:56:38 27 4
gpt4 key购买 nike

我是 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 个字节被写入内存中未正确分配的某个位置。

是否仅仅因为它没有离开堆栈就可以工作?

有人可以指点我一个地方,在那里我可以找到关于这些东西的启示吗?

最佳答案

That provides a Pointer to int, but I didn't allocate enough memory for an int. Why does it work then?

malloc 的返回值是 void*,语言允许将其隐式转换为任何指针类型,在本例中为 int*。编译器通常不包括检查您传递给 malloc 的内容是否满足特定大小要求的行为,在现实世界的代码中这可能非常困难(当编译时未知的非常量大小是传递给 malloc)。正如您所说,C 编译器通常是极简主义的。有诸如“静态分析”工具之类的东西可以分析代码以尝试找到这些错误,但这是与编译器完全不同的一类工具。

... it works perfectly fine, although now at the latest I'd expect some error like a segmentation fault. I mean, sizeof(char) is 1 and sizeof(int) is 4 on my machine. Hence 3 bytes are written to some place in memory which hasn't been allocated properly.

超出分配内存范围的写入称为“未定义行为”。这意味着当发生这种情况时,兼容的编译器可以做任何它想做的事。有时它会崩溃,有时它会覆盖您程序中的一些其他变量,有时什么也不会发生,有时什么也不会发生似乎并且您的程序会在以后崩溃。

在这种特殊情况下,大多数 malloc 的实现都会分配至少 16 个字节(或多或少,例如 8 或 32),即使您要求的更少也是如此。因此,当您覆盖单个分配的字节时,您正在写入未用于任何用途的“额外”内存。 强烈不建议您在任何实际程序中依赖该行为。

Does it work just because it doesn't leave the stack?

堆栈与这种特定情况无关。

Could somebody please point me to a place where I might find enlightenment concerning that stuff?

任何好的 C 书都会有这种类型的信息,请看这里:The Definitive C Book Guide and List

关于c - 为某种类型分配更少的空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868437/

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