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

问题描述 投票:0回答:3

为什么打印带有%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 '\0'
  printf("%s",c); //aa..(then some random output)
    return 0;
}

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

c segmentation-fault
3个回答
3
投票

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

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

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


0
投票

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

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


0
投票

这是你打算做的:

#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 '\0'
    printf("%s",c); //aa..(then some random output)
    return 0;
}

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

#include <stdio.h>

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

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

© www.soinside.com 2019 - 2024. All rights reserved.