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

标签 c

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

  1. 注释掉b=a
  2. 在 *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/

相关文章:

C:如何将用户输入限制为由空格分隔的 2 个参数?

检查 malloc/calloc 的分配

c - 解决简单 C 扫描器中的 clang 警告

c - 消息 "warning: implicit declaration of function"

c++ - 可以在 taskkill 命令期间调用 atexit() 吗?

C程序显示顺序

c - 如何在文本文件中记录 dbx session ?

c - 在 C 中使用 pthread?

c - 通过 malloc-heap(Concatenate string) 分配内存

c - X 与范围 L 到 R 中的每个数组元素的 XOR 的总和