如何解决测试冒泡排序算法时,控制台会在一秒钟后关闭 动态数组在堆上固定大小的数组
我检查过,没有语法错误。我使用 Code::Blocks 在 C 中编码,这是我第一次遇到类似的错误。当我运行代码时,控制台会在一秒钟后启动并关闭。它甚至不打印 printf
中的内容。
#include <stdio.h>
int main(void)
{
int n;
int vet[n];
int t;
int i;
int lim;
int lastswap;
int swap;
printf("Array lenght:");
scanf("%d\n",&n);
for (i = 0; i < n; i++)
{
scanf("%d\n",&vet[i]);
}
lim = 0;
do
{
swap = 0;
for (i = n - 1; i > lim; i--)
{
if (vet[i] < vet[i - 1])
{
t = vet[i];
vet[i] = vet[i - 1];
vet[i - 1] = t;
swap = 1;
lastswap = i;
}
lim = lastswap;
}
} while (swap != 0);
for (i = 0; i < n; i++)
{
printf("%d\n",vet[i]);
}
}
解决方法
主要问题
当用于指定数组大小 n
时,vet
的值是undefined。这是一个错误,C 编译器应该阻止您这样做(即使它配置为 C99 或 C11)。[1][2]
动态数组(在堆上)
创建大小在运行时确定的数组的首选方法是在堆上分配内存。[2]为此,应按正确顺序执行以下步骤:
... 在写入数组之前。顺便说一句:用完后别忘了free
内存。
这样的东西可能是您的基本“框架”(根据您的需要更改 UPPER_LIMIT
):
#define UPPER_LIMIT 1024 /* or enum { UPPER_LIMIT=1024 }; */
int n;
if (scanf("%d",&n) == 1) {
if (0 < n && n < UPPER_LIMIT) {
int* vet = malloc(n*sizeof *vet);
if (vet) {
/* work on vet */
}
free(vet);
}
}
固定大小的数组
另一种选择是使用固定维度的数组,然后您必须检查输入中的n
是否在固定数组的范围内:
#define UPPER_LIMIT 1024 /* or enum { UPPER_LIMIT=1024 }; */
int n;
int vet[UPPER_LIMIT];
if (scanf("%d",&n) == 1) {
if (0 < n && n < UPPER_LIMIT) {
/* work on vet */
}
}
次要问题
在 scanf
的格式字符串中使用换行符会导致 Behaviour of scanf when newline is in the format string 中讨论的问题。所以最好切换到 scanf("%d",&n);
和 scanf("%d",&vet[i]);
。顺便说一句:不要忘记检查 scanf
的返回值和输入。
脚注
[1] 不清楚为什么 GDB online Debugger 接受此为有效代码,但这可能是另一个问题的主题。
[2] C99 支持可变长度数组 (VLA),这是一种声明大小在运行时确定的数组的方法。为此,必须在数组声明之前用大于零的值定义大小变量。 (在 Array declaration,section Variable-length arrays 中阅读更多内容)。 C11 将可变大小数组合并为一个实现定义的特性 - 这意味着符合标准的 C99 代码可能不可移植。对于 VLA 的实际好处也没有达成共识,例如 Difficulty in understanding variable-length arrays in C
可变大小数组 C99(+):
#define UPPER_LIMIT 1024 /* or enum { UPPER_LIMIT=1024 }; */
int n;
if (scanf("%d",&n) == 1) {
if (0 < n && n < UPPER_LIMIT) {
int vet[n];
/* work on vet */
}
}
,
我有点想通了。我将 n
声明为常量删除了 scanf
并且它起作用了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。