String 为什么这是错误的!?生成字符串

String 为什么这是错误的!?生成字符串,string,compiler-errors,segmentation-fault,String,Compiler Errors,Segmentation Fault,我一直在尝试以这种方式生成字符串: a b z aa ab zz zzzz 我想知道为什么分段错误(堆芯转储)在到达“yz”时会出现提示。我知道我的代码没有涵盖所有可能的字符串,比如'zb'或'zc',但这并不是问题的全部,我想知道为什么会出现这种错误。我不是你所看到的编码大师,所以请试着解释清楚。谢谢:) #包括 #包括 #包括 #包括 无效移动位置(字符s[]); int main(int argc,char*argv[]) { chars[28]; s[0]=''; s[1

我一直在尝试以这种方式生成字符串:

a

b

z

aa

ab

zz

zzzz

我想知道为什么分段错误(堆芯转储)在到达“yz”时会出现提示。我知道我的代码没有涵盖所有可能的字符串,比如'zb'或'zc',但这并不是问题的全部,我想知道为什么会出现这种错误。我不是你所看到的编码大师,所以请试着解释清楚。谢谢:)

#包括
#包括
#包括
#包括
无效移动位置(字符s[]);
int main(int argc,char*argv[])
{
chars[28];
s[0]='';
s[1]='\0';
int a=0;

对于(int r='a';r首先,让我们在启用调试的情况下编译:

gcc -g prog.c -o prog
现在让我们在调试器下运行它:

> gdb prog
GNU gdb 6.3.50-20050815 (Apple version gdb-1822) (Sun Aug  5 03:00:42 UTC 2012)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .. done

(gdb) run
Starting program: /Users/andrew/Documents/programming/sx/13422880/prog 
Reading symbols for shared libraries +............................. done
a
b
c
d
e
...

yu
yv
yw
yx
yy
yz

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00007fffc0bff6c5
0x0000000100000c83 in main (argc=1, argv=0x7fff5fbff728) at prog.c:22
22                      s[a] = (char)y;  
好的,它在第22行崩溃了,试图执行
s[a]=(char)y
。什么是
a

(gdb) p a
$1 = 1627389953
因此,您正在设置数组
s
的第160万个条目。什么是
s

(gdb) ptype s
type = char [28]

在28个元素的数组中保存160万个条目?这行不通。看起来你需要在一些循环开始时将
a
重置为零。

请更新标题,这样这个问题对未来的访问者会很有用。否则它可能会因过于本地化而关闭。谢谢andrew!你是对的!但我不知道为什么会这样范围从1到160万。我试图解决这个问题,但突然它改变了,而没有进入“a”改变其值的语句。它有点古怪。它打印出“za”,在a=1之前和之后(但在进入if条件改变其值之前),a=160万:(为什么?你可以在这张图片中看到:@user1830562我很高兴我能提供帮助。屏幕截图中的代码与你上面问题中的代码不同——我必须查看所有代码才能找到答案。无论如何,既然你是该网站的新手,请确保任何有帮助的回答,以及对你的最佳答案。)我们的问题。如果你不经常这样做,人们将来就不太可能回答你的问题了。谢谢!再次感谢安德鲁!是相同的代码,但我改了“a”到一个长整型而不是一个整型。此外,有三个printf和两个系统暂停,但只是为了检查代码和获取我发布的图像!很抱歉,我没有投票给你,因为我需要15个声誉,但我还没有:(
(gdb) ptype s
type = char [28]