c - 为什么打印带有 %s 的字符会出现段错误?

标签 c segmentation-fault

为什么打印带有 %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;
}

抱歉,如果这个问题很愚蠢,我只是个初学者。

最佳答案

Why does printing a character with %s gives a segmentation fault everytime?

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

当您将 'a' 传递给 printf 时,它会得到一个值 0x41(ASCII 代码a), 该值解释为一个指针,它指向内存的最低页面,该页面受禁止访问保护 -> SIGSEGV .

关于c - 为什么打印带有 %s 的字符会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55507655/

相关文章:

c - 返回 0/fclose/free 时出现程序段错误。我想我有内存泄漏但找不到它们。请帮忙!

c - 小端和大端分配

C 错误 : expected '=' , ',' , ';' ,

C 指针数组与原始值数组 : performance and memory

c - 在 if 条件下改变字符串变量

c - 解引用指针并为其分配值

c - 在 C 中 Malloc 字符串数组的数组

C 程序在输入字符后崩溃

c - 如何摆脱段错误 : 11

C 比较位时的比较排序段错误