【问题标题】:unsigned int variable that increases++ the value for no apparent reason无符号整数变量,无明显原因增加 ++ 值
【发布时间】:2013-09-20 04:14:17
【问题描述】:

我有一个变量会在没有任何通知的情况下增加它的值。它的行为可以通过在代码的一些随机部分中通过简单的 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:我不知道问题是否足够清楚,但如果没有,请询​​问所需的信息。

【问题讨论】:

  • 你确定你没有超出graus的范围吗?

标签: c variables memory ansi


【解决方案1】:

你有一个内存溢出的行

graus[grau]++;

因为 grau 从 1 到顶点。您需要将其修改为

graus[grau - 1]++;

graus 也应该用顶点来声明,而不是顶点 - 1

unsigned graus[vertices];

【讨论】:

  • Emm...graus[0u - 1] 如果都是getValueFromMatrix() === false?
【解决方案2】:

grau 可以是 0vertices 的值。由于您声明了unsigned graus[vertices-1],这将溢出到堆栈上的下一个内容,在您的情况下似乎是arestas

如果你有vertices = 1grau 将是01,因此graus 需要能够包含2 个元素,因此unsigned graus[vertices+1];

修复graus的大小,你应该会很好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多