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,分段错误”?