以下代码片段在64位Ubuntu 14.04上执行,同时在32位Ubuntu 14.04中出现seg故障。 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位系统 -
a=malloc (sizeof(int));
醇>
有人可以解释一下这个观察
答案 0 :(得分:2)
这不是32位与64位的问题,而是使用未指向有效内存地址的指针的问题。在您的代码段中,您已声明了指针*a
和*b
,而没有将它们实际指向任何位置,从而导致未定义的行为。
使用指针时,请始终立即分配足够的内存,或将它们指向现有的相应变量。
例如,所有后续陈述都有效:
int *a = NULL;
int *b = malloc(sizeof(int));
int c = 42;
int *d = &c;
通过不初始化它们,它们指向任意位置。 *a = 40;
可能已经工作了#34;偶然的&#34;对你来说,因为它可能指向你当时访问过的内存空间。但是,在一般情况下,此代码段应在任一操作系统中产生分段错误。
如果您不打算将指针立即指向有效的内存地址,请考虑将其初始化为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&#39; s,@ tuple_cat&#39; s和@Weather Vane的反馈]