【发布时间】:2018-07-27 20:35:07
【问题描述】:
我不是专业人士,所以请多多包涵。
我正在学习C,为了练习,我做了一个小程序,从argv读取几个数字,并按升序排序。
到目前为止,它运行良好。除了两件事:
- 程序在列表中添加了一个额外的零(我知道为什么会这样,但现在不想修复它)
- 在这个过程中,最大的数字不知何故变成了零(我不知道为什么会发生这种情况,我想修复它)
我特别关心问题 #2。
例如,当运行 ./a.out 6 8 4 9 3 时,输出会输出到 0 0 3 4 6 8 而不是 0 3 4 6 8 9(我再次只关心 9 的消失)
如果有帮助,我在 Linux 上使用 gcc 版本 7.3.1。
为什么最大的数会变成零?
代码:
#include <stdio.h>
#include <stdlib.h>
void flip(short position, short * values){
int key = values[position];
values[position] = values[position + 1];
values[position + 1] = key;
}
void sort(short * values, short argc){
for( short iterations = argc; iterations > 0; --iterations){
for( short position = 1; position < iterations; ++position){
if (values[position] > values[position + 1])
flip(position, values);
}
}
for ( short i = 0; i < argc; ++i )
printf("%d ", values[i]);
printf("\n");
}
int main(short argc, char **argv){
if ( argc <= 1 ){
fprintf( stderr, "USAGE: %s <<short int>...>\n", argv[0] );
return 1;
}
short *values = malloc(sizeof(short) * (argc-1));
for (int i = 1; i < argc; ++i ){
values[i] = strtol(argv[i], NULL, 0);
}
sort(values, argc);
return 0;
}
任何帮助将不胜感激。
编辑:通过 GDB 运行它后,我发现问题不在主函数中,因为当 sort 启动时,x/6uh values 仍然返回正确的值。当我在flip 内时,就会出现问题。不过还是不知道是什么问题...
【问题讨论】:
-
然而,一个好的开始是考虑
realloc返回 -
既然知道argc的大小,为什么还要realloc呢?为什么不只做一个 malloc(sizeof(short)*argc)?
-
使用
gdb很好,但您的编辑听起来好像您认为您已经从中获得了一切。我确信事实并非如此。但是,现在您知道将注意力(在 gdb 中)集中在sort函数上。 -
你知道 C 中的数组从位置 0 开始吗?
标签: c bubble-sort