你好,我正在编写一个程序,我以这种方式声明了一个字符串:
char *string=malloc(sizeof(char));
在我的笔记本电脑中,我使用的是64位Mint OS,一切正常。然而,在一台 32 位的 Debian 机器中,我在那行代码中遇到了分段错误。如果我声明没有malloc的字符串,就像这样:char string[100]程序工作正常。当我使用 GDB 运行该程序时,它说找不到 malloc.c 或类似的东西。这种行为合乎逻辑吗?如果有人以前遇到过同样的问题,请解释为什么会发生这种情况吗?提前谢谢。
您只为字符串分配了 1 个字节,因此您可能覆盖了其他变量或 malloc 堆结构。
改变:
char *string=malloc(sizeof(char));
到更真实的尺寸,例如:
char *string=malloc(256);
除了另一个答案之外,我试图解释为什么它在 32 位上失败,但在 64 位上成功:
最有可能的是,您的内存管理器以一定的粒度工作,这取决于系统的字大小。也许它在 4 位系统上是 32 字节,在 8 位系统上是 64 字节。(但是,我不确定这是否正确。
如果分配 1 个字节,则有 3 个或 7 个字节未使用。因此,虽然您不被允许使用它们,但什么都不会发生。
如果您使用超过 3 个字节,但最多 7 个字节,则在 64 位系统上不会发生任何事情,但在 32 位系统上,程序会崩溃。
要分配 100 个字符的字符串,您必须分配 101 个字符,+1 是结束字符' '
因此:
char *string = malloc(sizeof(char) * 101);
sizeof(char)
允许创建与您的操作系统兼容的字符(65/32位);
char 在 64 位系统或 32 位系统中始终具有相同的大小,但是对于 int
或 long
等其他类型的字符,它们在 32 位或 64 位上具有不同的大小!
从 POSIX on malloc:
The pointer returned if the allocation succeeds shall be suitably aligned so that it may be assigned to a pointer to any type of object and then used to access such an object in the space allocated (until the space is explicitly freed or reallocated).
这是未定义的行为,但解释在于短语"适当对齐"。这完全是实现定义的,但对于大多数架构,它必须至少在单词边界上。
假设这是真的,那么一个字的大小可以决定下一个可能的"适当对齐"内存位置的位置:距离分配的 1 字节缓冲区的开头 4 个字节或 8 个字节。
因此,除了这段代码有问题之外,似乎解释是该实现允许写入超过malloc末尾的一些字节,其中"一些字节"是wordsize的函数。