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

#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语言中处理多维数组(和指针)时,解决此问题很有用。我更喜欢通过编码学习,但是我也有一本书。例如。该算法可以应用于列换位编码器/解码器的实现中。因此,如果您可以指出我的代码中的不良编码做法,请告诉我。就是说,我非常重视可以帮助我找到似乎无法通过调试程序解决的问题的答案,而我只是不知道下一步该怎么做。

谢谢。

最佳答案

正如您在注释的深处发现的那样,这里的问题是您的程序正在使用未初始化的值。

调试器可能会将您的malloc内存清零,而在为发行/生产进行编译时,清零将被优化。

除了跟踪分配的数量并在len中使用exists(pos, len, j)代替分配数量之外,另一种可能的解决方案是分配后直接将pos显式清零(例如memset(pos, '\0', sizeof *pos * len))或使用calloc,因为这会为您执行调零。

关于c - c-字符的字母顺序:运行与调试时输出不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42239906/

10-11 22:13
查看更多