0

您好,我正在编写一个程序,并且我以这种方式声明了一个字符串:

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

在我的笔记本电脑中,我使用的是 64 位 Mint OS,一切正常。但是在 32 位 Debian 机器中,我在那行代码中出现分段错误。如果我声明没有 malloc 的字符串,如下所示:char string[100]该程序运行良好。当我使用 GDB 运行程序时,它显示 malloc.c not found 或类似的东西。这种行为合乎逻辑吗?如果有人以前遇到过同样的问题,请解释一下为什么会发生?提前致谢。

4

4 回答 4

3

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

改变:

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

到更现实的尺寸,例如:

char *string=malloc(256);
于 2012-11-27T14:19:49.687 回答
2

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

最有可能的是,您的内存管理器以一定的粒度工作,这取决于您系统的字长。也许在 32 位系统上是 4 个字节,在 64 位系统上是 8 个字节。(但是,我不确定这是否正确。)

如果分配 1 个字节,则有 3 个字节。7 个字节未使用。因此,尽管您不允许使用它们,但什么都不会发生。

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

于 2012-11-27T14:25:30.510 回答
1

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

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

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

于 2012-11-27T14:27:30.897 回答
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 末尾的某些字节,其中“某些字节”是 wordsize 的函数。

于 2012-11-27T15:27:36.263 回答