这是我的问题:以下可编译代码在简单运行与调试时产生不同的结果。我在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中处理多维数组(和指针)时,解决这个问题很有用。我更喜欢通过编码学习,但是我手边还有一本书。例如。该算法可以应用于柱状转置编码器/解码器的实现。因此,如果您可以在我的代码中指出错误的编码实践,请告诉我。也就是说,我非常重视帮助我找到似乎逃避调试器的问题的答案,而我正处于一个我不知道下一步该尝试的地方。
感谢。
答案 0 :(得分:0)
正如您在评论深度中发现的那样,此处的问题是您的程序使用的是未初始化的值。
您的调试器可能已将您的malloc
内存归零,其中 - 当您为发布/生产编译时,归零将被优化掉。
另一个可能的解决方案,除了跟踪您所做的分配的数量,并在len
中使用{em>分配<{}}}时,明确归零{分配后直接{1}}(例如exists(pos, len, j)
),或使用pos
,因为这会为您执行归零。