为什么用%s打印字符会导致分段错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么用%s打印字符会导致分段错误?相关的知识,希望对你有一定的参考价值。

为什么打印带有%s的字符每次都会出现分段错误?

#include <stdio.h>

int main()
{
  char c = 'a';
  printf("%s",c);
    return 0;
}

如果它可能是由于没有得到' 0'并且它继续读取除非访问只读存储器位置,为什么这一直在发生? (因为它应该在某处(最可能)得到 0,就像这段代码一样

#include <stdio.h>

int main()
{
  char c[2];
  c[0] = 'a';
  c[1] = 'a'; //skipping ''
  printf("%s",c); //aa..(then some random output)
    return 0;
}

对不起,如果问题很愚蠢,我只是个初学者。

答案

为什么打印带有%s的字符每次都会出现分段错误?

因为%s告诉printf该参数是指向字符串的指针,并且因为大多数现代系统保护低地址内存不受所有访问(以防止这样的错误保持不被检测)。

当你传递'a'printf时,它得到一个值0x41ASCIIa代码),将该值解释为指针,指向内存的最低页面,受无访问保护 - > SIGSEGV

另一答案

因为%s printf期望指向字符串的指针。因此,当printf尝试从地址打印时,c(c的值)存储可能无效(因为它实际上不是地址),因此导致段错误。

你可以做printf(“%s”,&c); //这可能会产生一些垃圾值

另一答案

这是你打算做的:

#include <stdio.h>

int main()
{
    char c = 'a';
    printf("%c",c);  /* <<<< use %c instead of %s, read printf(3) */
    return 0;
}

如果你这样做:

#include <stdio.h>

int main()
{
    char c[2];
    c[0] = 'a';
    c[1] = 'a'; //skipping ''
    printf("%s",c); //aa..(then some random output)
    return 0;
}

这次你传递printf()一个指针(单独的数组名称c被解释为第一个元素的地址,因此可以使用printf()格式说明符传递给%s。这次,缺少使printf()继续打印直到获得,您可以将代码更改为:

#include <stdio.h>

int main()
{
    char c[2];
    c[0] = 'a';
    c[1] = '';
    printf("%s",c); // you get only a
    return 0;
}

你会得到a作为打印输出。

以上是关于为什么用%s打印字符会导致分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

将向量的整数内容打印为字符串会导致分段错误 [关闭]

为啥释放内存会导致分段错误?

为啥此代码会导致分段错误错误?

为啥我的字符串分配会导致分段错误?

为啥重新声明 std::cout 会导致分段错误?

为什么此代码导致分段错误?