【发布时间】:2012-01-01 21:55:29
【问题描述】:
可能重复:
Invalid read/write sometimes creates segmentation fault and sometimes does not
我有以下代码:
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr = NULL;
ptr = malloc(sizeof(char));
if (ptr) {
*ptr = 10;
printf("sizeof(int): %zu\nsizeof(char): %zu\n", sizeof(int), sizeof(char));
printf("deref of ptr: %d\n", *ptr);
free(ptr);
return EXIT_SUCCESS;
}
else
return EXIT_FAILURE;
}
当我编译并运行它时,我得到以下输出:
$ gcc test.c
$ ./a.out
sizeof(int): 4
sizeof(char): 1
deref of ptr: 10
值sizeof(char) 小于sizeof(int)。我的malloc 调用只为char 留出了足够的空间。然而,我的程序能够为ptr 分配一个整数值而不会崩溃。为什么会这样?
【问题讨论】:
-
您可能希望查看此问题及其答案以获得指导:stackoverflow.com/questions/8641478/…
-
C 不一定会尊重变量“边界”,因此您可能会覆盖内存中的一些随机 3 字节,这些字节恰好跟随您分配的字节。
-
sizeof(char)始终为 1(6.5.3.4,§3)。 -
调用未定义行为的美妙之处在于,任何事情都可能发生,而且“没问题”——所需的行为是未定义的。
-
如果您有答案,如果您尝试将它们添加为答案而不是 cmets,我将不胜感激。