【发布时间】:2018-07-27 09:31:43
【问题描述】:
我有以下代码(不是我写的,简化后只显示有问题的部分):
#include <stdlib.h>
typedef struct test_struct {
unsigned int foo;
char *dummy;
} test_struct;
int main()
{
test_struct *s = (test_struct *) malloc(10 * sizeof(test_struct));
s = (test_struct *)((unsigned long)s + 16);
s->foo = 1; // crash!
}
程序为 10 个结构(在我的平台中为 10*24 字节)分配内存。然后,指针增加了 16 个字节,并尝试在该位置写入一个数字。
我已经在 4 台计算机上测试了这个 sn-p。其中两个在 Windows 7 x64 上运行,并且运行良好。另一个在 lubuntu x64 上运行,也可以按预期工作。另一个是 Windows 10 x64,它崩溃了。
你能帮我理解这些行有什么问题吗?我正在使用执行此操作的第三方库,但我不知道到底发生了什么。
【问题讨论】:
-
你知道一个结构是24字节吗?即使是这样,那你为什么认为指向内存的 16 字节指针是有效的呢?添加 24 字节的偏移量(或任何
sizeof(test_struct)可能)不会更有意义吗? -
导致这个问题的真正问题是什么?你为什么要问?这样的用例是什么?
-
“按预期工作”这句话有点棘手。我认为这只是意味着您没有看到崩溃。仅仅因为程序“按预期工作”并不意味着它不是错误。你可以运行它,不会出错,但它仍然可能正在写入它不应该写入的内存。
-
@Someprogrammerdude,我知道 struct if 24 bytes 因为我在测试中打印了值。我希望指针是有效的,因为我分配了足够的空间(即使我分配了 5000 个字节它也不起作用)。我同意这没有多大意义,但我没有编写代码,我正在尝试修复它。谢谢!
-
问题不仅在于尺寸,还在于对齐。有些数据不能放在某些系统上的任何地址上。在这些平台上,未对齐的访问可能会导致异常。