32位和64位之间的行为差​​异

时间:2016-05-28 19:30:28

标签: c

以下代码片段在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位系统 -

  1. 评论出b = a
  2. 在* a = 40;
  3. 之前添加a=malloc (sizeof(int));

    有人可以解释一下这个观察

1 个答案:

答案 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的反馈]