如何编写接收输入单词并打印的C程序?代码报signal 11错误如何解决
报错原因
Signal 11是段错误(Segmentation Fault),触发原因是程序访问了无权限访问的内存地址,你的代码存在两个核心问题:
- 变量声明错误:
char *goodnight_message[20]声明的是长度为20的字符指针数组,本质是存储20个指针的空间,没有分配存储字符串的实际字符内存,无法直接存储用户输入的内容。 - 输入输出参数使用错误:
scanf("%s", &goodnight_message)把用户输入的字符串直接写入了指针数组本身的内存地址,覆盖了原本的指针存储区域,后续printf对被非法覆盖的指针做解引用操作时,访问到了非法内存地址,直接触发段错误。
修复后代码
#include <stdio.h> int main() { // 声明字符数组,分配20字节的连续存储空间用来存放输入的字符串 char goodnight_message[20]; printf("Enter the goodnight message.\n"); // 数组名本身就是首地址,不需要取地址符,加长度限制避免缓冲区溢出 scanf("%19s", goodnight_message); printf("%s Buddy.\n", goodnight_message); return 0; }
修复说明
- 变量声明调整:把
char *goodnight_message[20]改为char goodnight_message[20],直接声明字符数组,分配20字节的连续内存用来存储输入的字符串。 - 输入逻辑调整:
scanf参数去掉取地址符&,同时添加长度限制%19s,最多读取19个字符,留1位存储字符串结束符\0,避免缓冲区溢出风险。 - 输出逻辑调整:
printf直接传入字符数组名即可,不需要加解引用符*。
内容的提问来源于stack exchange,提问作者Ndaru John
相关产品推荐
相关产品推荐

