unsigned int变量,在没有明显原因的情况下增加++值

时间:2013-09-20 04:14:17

标签: 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

这是代码块:

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:我不知道问题是否足够清楚,但如果没有,请询​​问所需信息。

2 个答案:

答案 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 = 1grau将是01,因此graus需要能够包含2个元素,因此{{} 1}}

修正unsigned graus[vertices+1];的大小,你应该很好。

然而,@ WhozCraig也提出了一个关于循环边界的有趣问题。 ;)