【问题标题】:why printf('c') cause Segmentation fault?为什么 printf('c') 会导致分段错误?
【发布时间】:2017-10-31 13:59:05
【问题描述】:

这是我的测试代码。

#include <stdio.h>

int main() {
    printf('c');
    return 0;
}

所以: ubuntu16.04

编译器版本: gcc5.3

运行上面的代码会导致“movdqu (%rdi),%xmm0”中出现Segmentation fault错误。

我google了一下,但我想知道为什么会导致分段错误

【问题讨论】:

标签: gcc-warning


【解决方案1】:

因为您正在尝试发送一个字符,而不是一个字符串。 printf() 函数的第一个参数是一个格式字符串。 字符串用 "" 引用,字符用 '' 引用。

【讨论】:

  • 谢谢。我知道 print("c") 是对的。分段错误中的详细信息是非法访问内存?我只想知道
  • @kaiattrib printf 的参数是一个地址。 printf 将字符解释为程序允许访问之外的地址。
【解决方案2】:

我喜欢使用 GDB 调试程序时出现的错误。 image

【讨论】:

  • 老实说,我完全不理解发布文本图片链接的事情。另外:不是答案。
【解决方案3】:

简短:

这是C语言中printf函数的原型:

int printf ( const char * format, ... );

您应该传递 c-string(例如“这是我的消息”)而不是 char

详细:

这是printf函数在C语言中的原型:

int printf ( const char * format, ... );

这意味着第一个参数应该是指向以空结尾的数组char 的指针。事实上,printf 读取第一个参数的值,即内存中 c 字符串的地址,然后转到该地址并逐字节读取以达到空字符。在两种情况下,此代码会导致分段错误:

  1. printf 的第一个参数指向的地址是程序内存地址的出站地址。
  2. printf 在到达程序内存边界的末尾之前找不到从指定地址开始的任何空字符。

请注意使用非指针变量代替指针。这会导致您的程序在没有任何理由的情况下崩溃。

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 2021-01-27
    • 2016-10-31
    • 1970-01-01
    • 2021-07-18
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多