数组排序后存入新数组时遇无限循环问题求助
问题分析与修复
你的代码存在多个严重问题,直接导致无限循环和未定义行为,逐个拆解:
1. 无限循环的根源
for(int i = 0; i < malloc(sizeof(arr)); i++) 这行完全错误:
malloc返回的是内存地址(指针),和整数i比较时,指针会被强制转换成一个极大的整数值(比如64位系统下可能是几百万甚至更大),远大于原数组的实际长度,循环条件永远成立,自然无限运行。- 获取数组元素个数的标准写法是
sizeof(arr)/sizeof(arr[0]),这能准确算出静态数组的元素数量。
2. 未分配内存的result数组
int result[] = {}; 是非法的C代码:C不允许定义空的自动数组,这个数组没有任何内存空间,直接给result[i]赋值会触发内存越界,程序可能崩溃或出现诡异行为。你需要给result分配和原数组一样大小的内存,可以用静态数组(原数组长度固定时)或动态malloc。
3. 错误的类型转换与打印
strtod(arr[i])完全多余且错误:strtod是用来把字符串转换成double类型的,你的arr是int数组,直接赋值就行,而且这里参数类型不匹配(strtod需要const char*,你传了int),编译都会报错。printf("%s",result);类型不匹配:%s是打印字符串的格式符,result是int数组,应该用%d打印单个元素,且循环里要打印当前的result[i],不是整个数组。
修复后的代码(实现从大到小排序并存入新数组)
提供两种实现方式,分别适配不同场景:
方式1:静态数组(适合已知原数组长度的情况)
#include <stdlib.h> #include <stdio.h> int main(void) { int arr[] = {9, 6, 4, 6, 3, 2, 8, 1}; // 计算数组元素个数 int len = sizeof(arr) / sizeof(arr[0]); // 定义和原数组同长度的result数组 int result[len]; // 先把原数组元素复制到result for (int i = 0; i < len; i++) { result[i] = arr[i]; } // 冒泡排序实现从大到小排序 for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - 1 - i; j++) { if (result[j] < result[j + 1]) { int temp = result[j]; result[j] = result[j + 1]; result[j + 1] = temp; } } } // 打印排序后的结果 printf("排序后的数组:"); for (int i = 0; i < len; i++) { printf("%d ", result[i]); } printf("\n"); return EXIT_SUCCESS; }
方式2:动态内存分配(适合原数组长度不确定的情况)
#include <stdlib.h> #include <stdio.h> // 比较函数,用于qsort实现从大到小排序 int compare_desc(const void *a, const void *b) { return *(int*)b - *(int*)a; } int main(void) { int arr[] = {9, 6, 4, 6, 3, 2, 8, 1}; int len = sizeof(arr) / sizeof(arr[0]); // 动态分配内存给result int *result = malloc(len * sizeof(int)); if (result == NULL) { perror("malloc failed"); return EXIT_FAILURE; } // 复制原数组到result for (int i = 0; i < len; i++) { result[i] = arr[i]; } // 使用标准库qsort函数排序,效率更高 qsort(result, len, sizeof(int), compare_desc); // 打印结果 printf("排序后的数组:"); for (int i = 0; i < len; i++) { printf("%d ", result[i]); } printf("\n"); // 释放动态分配的内存 free(result); return EXIT_SUCCESS; }
内容的提问来源于stack exchange,提问作者Working dollar
相关产品推荐
相关产品推荐

