SIGSEGV,分段错误。 while printf() 数组索引的值

Posted

技术标签:

【中文标题】SIGSEGV,分段错误。 while printf() 数组索引的值【英文标题】:SIGSEGV, Segmentation fault. while printf() value of index of an array 【发布时间】:2018-10-11 10:44:22 【问题描述】:

我想知道 scanf 和数组是如何工作的,所以我创建了一个代码,逐行打印数组的每个索引的值。

#include<stdio.h>
int main()
    char a[35];
    scanf("%30s", a);
    for(int i=0;i<30;i++)
        printf("index %d value :%s\n",i,a[i]);
    

但我在编译代码时遇到错误。调试完代码后, 我收到“程序收到信号 SIGSEGV,分段错误”。 我正在使用 Dev-C++

【问题讨论】:

%s 格式字符串是干什么用的? a[i] 是什么? %s 用于一系列随机字符和数字,例如“asdf12”。 a[i] 是数组 a 索引 i 的值。 【参考方案1】:

使用 g++ 编译时,我收到以下警告:

test.cc: In function ‘int main()’:
test.cc:6:45: warning: format ‘%s’ expects argument of type ‘char*’, but argument 3 has type ‘int’ [-Wformat=]
         printf("index %d value :%s\n",i,a[i]);
                                         ~~~~^

您可能想将%s 更改为%c,因为数组的每个元素都是一个字符:

printf("index %d value :%c\n",i,a[i]);

【讨论】:

OMG 非常感谢@user000001 我是个新手。顺便说一句,当我输入“asdf”时,为什么会得到一些随机字符,例如 a[24]='3' ; a[16]='3' ; a[9]='$'。其他所有索引不应该是'\000'吗? 不,它只是读取终止\0之后内存中的任何内容,您可以获得任何值。 哦,现在一切都说得通了,我必须将所有元素初始化为 \0。感谢@user000001的解释【参考方案2】:

同意楼上的回答。 %s 表示取消引用 arg 并显示内容。 a[i] 使用 8 位值作为指针。

【讨论】:

以上是关于SIGSEGV,分段错误。 while printf() 数组索引的值的主要内容,如果未能解决你的问题,请参考以下文章

分段错误错误(信号名称:SIGSEGV)的原因是啥,我将如何找到/修复它?

程序接收信号 SIGSEGV 分段错误

写入时出现SIGSEGV分段错误,但不读取?

当我尝试从双向链表中删除最后一个元素时,为啥会收到“信号 SIGSEGV,分段错误”?

程序接收信号 SIGSEGV,ASM 中使用 SHRD 的分段错误

如何编写一个运行程序的 bash 脚本,直到它检测到信号 SIGSEGV、分段错误?