【问题标题】:Printf ubuntu Segmentation fault (core dumped)Printf ubuntu 分段错误(核心转储)
【发布时间】:2012-12-15 16:53:57
【问题描述】:

我有这个代码:

int a;
printf("&a = %u\n",(unsigned)&a);
printf("a\n");
printf("b\n");
printf("c\n");
printf("d\n");

我试图打印a变量的指针。
但它在printf("a\n"); 行上失败并说Segmentation fault (core dumped)
输出:

&a = 134525024
Segmentation fault (core dumped)

当我从代码中删除行 printf("&a = %u\n",(unsigned)&a); 时,它成功了。 输出:

a
b
c
d

我的代码中有什么磨损?

【问题讨论】:

  • 这是你的全部源代码吗?
  • 你所展示的没有错。
  • 使用%p打印指针值,而不是%u
  • @Rohan 它被转换为unsigned,所以%u 是正确的(尽管%pvoid* 的转换会提供更多信息)。
  • #include <stdio.h>了吗?您是否将-Wall 添加到您的编译选项中(或者,当您这样做时会发生什么)?您最好还包括#include <inttypes.h> 并使用printf("%a = 0x%.8" PRIXPTR "\n", (uintptr_t)&a); 作为(在定义uintptr_t 的所有系统上)保证结果不会截断任何数字(而转换为intunsigned、@ 987654341@,unsigned long,甚至unsigned long long 都不能保证这样做)。那是一个 C99 头文件,但它在 Linux 中是可以的。

标签: c ubuntu segmentation-fault printf


【解决方案1】:

这可能是架构问题。我在 OS X 上运行它并且运行良好:

#import <stdio.h>
int main()
{
    int a;
    printf("&a = %u\n",(unsigned int)&a);
    printf("a\n");
    printf("b\n");
    printf("c\n");
    printf("d\n");
}

但是,我在编译过程中确实收到了警告:

warning: cast from pointer to integer of different size

我在 64 位机器上,所以我的 64 位指针无法放入 32 位 int。 尝试运行它,看看你会得到什么:

#import <stdio.h>
int main()
{
    int a;
    printf("unsigned %ld\n", sizeof(unsigned)); // sizes reported in bytes
    printf("int %ld\n", sizeof(int));           // same as unsigned
    printf("long %ld\n", sizeof(long));         // should fit a pointer
    printf("ptr %ld\n", sizeof(void*));         // size of a pointer
    printf("&a = %lu\n", (unsigned long)&a);    // should print out your pointer
    printf("&a = %p\n", &a);                    // the Right Way of doing things
}

输出:

unsigned 4
int 4
long 8
ptr 8
&a = 140734544742408
&a = 0x7fff508c0808

编辑:

如果您不知道,unsigned 实际上是指unsigned int。同样,long 实际上意味着 long int

此外,值是signed 还是unsigned 不会改变它的物理大小,只会改变它的解释方式。您可以从前 2 次打印中看到这一点。

【讨论】:

  • 它也不适合我...我使用vmware来模拟ubuntu
  • 您是否收到任何编译警告? gcc -o test test.c
  • 是的,我的编译器理解该指令。抱歉走出 C.#import#includeinclude guards built in 大致相同。无论如何,如果这是一个问题,那将是一个编译时问题。
  • #import 是 Objective-C。
【解决方案2】:

我解决了我的问题。我只是重新安装了我的 ubuntu 和 vmware,现在它可以工作了。我不确定到底是什么问题,但它解决了我的问题... :-)

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多