C 增加++;没有明显原因的价值
我有一个变量,它可以在没有任何通知的情况下增加它的值。它的行为可以通过简单的printf()在代码的某些随机部分进行修改 我在gdb中附加了我的可执行文件,得到了以下信息:C 增加++;没有明显原因的价值,c,variables,memory,ansi,C,Variables,Memory,Ansi,我有一个变量,它可以在没有任何通知的情况下增加它的值。它的行为可以通过简单的printf()在代码的某些随机部分进行修改 我在gdb中附加了我的可执行文件,得到了以下信息: 101 graus[grau]++; (gdb) print arestas $7 = 5 (gdb) n 95 for (i = 1 ; i <= vertices ; i++) { (gdb) print arestas $8 = 6 谢谢你的帮助 PS:我不知道这个问题是否足够清楚,但
101 graus[grau]++;
(gdb) print arestas
$7 = 5
(gdb) n
95 for (i = 1 ; i <= vertices ; i++) {
(gdb) print arestas
$8 = 6
谢谢你的帮助
PS:我不知道这个问题是否足够清楚,但如果不清楚,请询问所需的信息。您有一行内存溢出
graus[grau]++;
因为grau从1到顶点。您需要将其修改为
graus[grau - 1]++;
此外,graus应该用顶点位置来声明,而不是顶点-1
unsigned graus[vertices];
您的线路内存溢出
graus[grau]++;
因为grau从1到顶点。您需要将其修改为
graus[grau - 1]++;
此外,graus应该用顶点位置来声明,而不是顶点-1
unsigned graus[vertices];
grau
可以是0
到顶点的值。由于您声明了未签名的graus[vertices-1]
,这将溢出到堆栈上的下一个对象中,在您的示例中,它似乎是AreStats
如果您得到顶点=1
,grau
将是0
或1
,因此graus
需要能够包含2个元素,因此无符号graus[顶点+1]代码>
修正一下graus的大小,你就应该很好了
然而,@WhozCraig也提出了一个关于循环边界的有趣问题 grau
可以是0
到顶点的值。由于您声明了未签名的graus[vertices-1]
,这将溢出到堆栈上的下一个对象中,在您的示例中,它似乎是AreStats
如果您得到顶点=1
,grau
将是0
或1
,因此graus
需要能够包含2个元素,因此无符号graus[顶点+1]代码>
修正一下graus的大小,你就应该很好了
然而,@WhozCraig也提出了一个关于循环边界的有趣问题 你确定你没有在graus
的范围之外写作吗?你确定你没有在graus
的范围之外写作吗?呃graus[0u-1]
if allgetValueFromMatrix()==false
?Ermmgraus[0u-1]
如果全部getValueFromMatrix()==false
?