为什么打印带有%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;
}
对不起,如果问题很愚蠢,我只是个初学者。
为什么打印带有%s的字符每次都会出现分段错误?
因为%s
告诉printf
该参数是指向字符串的指针,并且因为大多数现代系统保护低地址内存不受所有访问(以防止这样的错误保持不被检测)。
当你传递'a'
到printf
时,它得到一个值0x41
(ASCII
的a
代码),将该值解释为指针,指向内存的最低页面,受无访问保护 - > 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 '\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
作为打印输出。