以下代码片段在 64 位 Ubuntu 14.04 上执行,而在 32 位 Ubuntu 14.04 中出现段错误。 4.8.4 中的 gcc 版本相同(Ubuntu 4.8.4-2ubuntu1~14.04)
#include<stdio.h>
main ()
{
int* a;
int* b;
*a = 40;
b=a;
printf ("%x ............. %p ...........%d \n",*a,a, *a);
}
如果两者之一完成,则同样的事情在 32 位系统上起作用 -
- 注释掉b=a
- 在 *a=40; 之前添加
a=malloc (sizeof(int));
有人可以解释一下这个观察吗
最佳答案
这不是 32 位与 64 位的问题,而是使用未指向有效内存地址的指针的问题。在您的代码片段中,您声明了指针 *a
和 *b
,但没有实际将它们指向任何地方,从而导致未定义的行为。
使用指针时,始终立即分配足够的内存,或将它们指向现有的相应变量。
例如,所有后续语句都是有效的:
int *a = NULL;
int *b = malloc(sizeof(int));
int c = 42;
int *d = &c;
如果不初始化它们,它们就会指向任意位置。 *a = 40;
可能“偶然”为您工作,因为它可能指向您当时可以访问的内存空间。但是,在一般情况下,此代码片段应该在任一操作系统中产生段错误。
如果您不打算立即将指针指向有效的内存地址,请考虑将其初始化为NULL
,以避免出现悬空指针。您永远不应该取消引用 NULL
指针,但您可以在尝试这样做之前始终检查指针是否为 NULL
。例如:
int *a = NULL;
if ( a != NULL ) {
*a = 42;
}
int *b = a;
if ( b != NULL ) {
printf("%d\n", *b);
}
此代码段不会打印任何内容,因为 *a
和 *b
都将为 NULL
,但您的代码不会产生段错误。
值得一提的是,我在 Debian 64 位系统上也遇到了段错误。
[经过编辑以整合@AnT、@tuple_cat 和@Weather Vane 的反馈]
关于c - 32 位和 64 位之间的行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37503061/