我有一个变量,可以在没有任何通知的情况下提高它的价值。它的行为可以通过代码的一些随机部分中的简单printf()进行修改。
我在gdb中附加了我的可执行文件,得到了这个:
101 graus[grau]++;
(gdb) print arestas
$7 = 5
(gdb) n
95 for (i = 1 ; i <= vertices ; i++) {
(gdb) print arestas
$8 = 6
这是代码块:
unsigned grau;
unsigned graus[vertices-1];
memset(graus, 0, sizeof(graus));
for (i = 1 ; i <= vertices ; i++) {
grau = 0;
for (j = 1 ; j <= vertices ; j++) {
if (getValueFromMatrix(matrix, i, j))
grau++;
}
graus[grau]++;
}
这是没有意义的,因为“arestas”变量甚至没有在循环中使用!
“arestas”变量在循环之前使用,并使用此代码块声明:
matrix = createMatrix(vertices, vertices);
arestas = 0;
if (!(arestas = loadAdjacencyMatrixFromFile(file, matrix))) {
fprintf(stderr, "ERRO: O arquivo fornecido não é valido\n");
exit(arestas);
}
感谢您的帮助。
PS:我不知道问题是否足够清楚,但如果没有,请询问所需信息。
答案 0 :(得分:2)
你的行内存溢出
graus[grau]++;
因为grau从1变为顶点。您需要将其修改为
graus[grau - 1]++;
此外,graus应声明顶点位置,而不是顶点 - 1
unsigned graus[vertices];
答案 1 :(得分:1)
grau
可以是值0
,最高为vertices
。由于你声明unsigned graus[vertices-1]
,这将溢出到堆栈中的下一个,在你的情况下似乎是arestas
。
如果您有vertices = 1
,grau
将是0
或1
,因此graus
需要能够包含2个元素,因此{{} 1}}
修正unsigned graus[vertices+1];
的大小,你应该很好。
然而,@ WhozCraig也提出了一个关于循环边界的有趣问题。 ;)