c - 字符的字母顺序:运行与调试时的输出不同?

时间:2017-02-15 02:58:11

标签: c arrays pointers gdb

这是我的问题:以下可编译代码在简单运行与调试时产生不同的结果。我在Windows 10上使用带有gdb调试器的NetBeans IDE 8.0.2和Cygwin工具。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

int exists(int* arr, int len, int i) {
    for (int j = 0; j < len; j++) {
        if (arr[j] == i) {
            return 1;
        }
    }

    return 0;
}

int* alpha_order(char* source, int len) {
    int* pos = malloc(sizeof(int) * len);

    char c = SCHAR_MAX;
    int cpos = 0;

    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len; j++) {
            if ((c > *source) && (exists(pos, len, j) != 1)) {
                c = *source;
                cpos = j;
            }

            source++;
        }

        source -= len;
        c = SCHAR_MAX;

        pos[i] = cpos;
    }

    return pos;
}

int main(void) {

    char* str = "JACUZZI";
    int len = strlen(str);

    int* pos = alpha_order(str, len);

    printf("[%s]\n", str);

    for (int i = 0; i < len; i++) {
        printf("[%c] : %d\n", str[pos[i]], (i + 1));
    }

    return 0;
}

我在这里期待的是以下结果,我每次调试项目时都能成功获得(带有断点,例如在pos[i] = cpos;行上):

[JACUZZI]
[A] : 1
[C] : 2
[I] : 3
[J] : 4
[U] : 5
[Z] : 6
[Z] : 7

然而,当我刚刚运行项目时,这是我得到的错误输出:

[JACUZZI]
[A] : 1
[C] : 2
[I] : 3
[U] : 4
[Z] : 5
[Z] : 6
[Z] : 7

我怀疑代码中的内存管理存在问题。这是我第一次尝试C而且我更熟悉Java(它有垃圾收集)。所以我很难意识到问题所在,特别是考虑到调试项目的结果正是我想要的每一步。

我编写的算法迭代字符串(char*数组)以找到最小值并将位置存储到int*数组中。 int*数组也用于检查已考虑的位置。这是一遍又一遍地完成,直到字符串中每个字符的位置都存储在int*数组中。

最终输出是给定字符串中字符的字母顺序。我相信时间复杂度是O(n ^ 3)并且我意识到可能有更有效的方法来获得相同的结果,但是我想指出我仍然习惯于C。宝贝步骤。

当我在C中处理多维数组(和指针)时,解决这个问题很有用。我更喜欢通过编码学习,但是我手边还有一本书。例如。该算法可以应用于柱状转置编码器/解码器的实现。因此,如果您可以在我的代码中指出错误的编码实践,请告诉我。也就是说,我非常重视帮助我找到似乎逃避调试器的问题的答案,而我正处于一个我不知道下一步该尝试的地方。

感谢。

1 个答案:

答案 0 :(得分:0)

正如您在评论深度中发现的那样,此处的问题是您的程序使用的是未初始化的值。

您的调试器可能已将您的malloc内存归零,其中 - 当您为发布/生产编译时,归零将被优化掉。

另一个可能的解决方案,除了跟踪您所做的分配的数量,并在len中使用{em>分配<{}}}时,明确归零{分配后直接{1}}(例如exists(pos, len, j)),或使用pos,因为这会为您执行归零。