malloc() - C中的奇怪分段错误

时间:2012-11-27 14:16:00

标签: c linux segmentation-fault malloc

你好我正在写一个程序,我已经用这种方式声明了一个字符串:

char *string=malloc(sizeof(char));

在我的笔记本电脑中,我使用64位Mint操作系统,一切正常。但是在32位Debian机器中,我在代码行中遇到了分段错误。如果我声明没有malloc的字符串,就像这样:char string [100]程序运行正常。当我用GDB运行程序时,它说找不到malloc.c或类似的东西。这种行为是否合乎逻辑?如果有人之前遇到过同样的问题,请解释一下为什么会发生这种情况?谢谢提前。

4 个答案:

答案 0 :(得分:3)

您只为字符串分配1个字节,因此您可能会覆盖其他变量或malloc堆结构。

变化:

char *string=malloc(sizeof(char));

更实际的尺寸,例如:

char *string=malloc(256);

答案 1 :(得分:2)

添加到另一个答案,我尝试解释为什么它在32位上失败,但在64位上成功:

最有可能的是,您的内存管理器使用某种粒度,这取决于系统的字大小。也许它在32位系统上是4个字节,在64位系统上是8个字节。 (但我不确定这是否正确。)

如果你分配1个字节,则有3个resp。未使用的7个字节。因此,虽然不允许使用它们,但不会发生任何事情。

如果使用3个以上,但最多7个字节,64位系统不会发生任何事情,但在32位系统上,程序崩溃。

答案 2 :(得分:1)

要分配100个字符的字符串,您必须分配101个字符,+1是结束字符'\0'所以:

char *string = malloc(sizeof(char) * 101);

sizeof(char)允许创建与您的操作系统兼容的字符(65 / 32bit);
在64位系统或32位系统中,char总是具有相同的大小,但对于intlong这样的其他类型,它们在32位或64位上具有不同的大小!

答案 3 :(得分:0)

来自malloc上的POSIX:

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结尾的字节,其中'some bytes'是wordsize的函数。