You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组排序后存入新数组时遇无限循环问题求助

问题分析与修复

你的代码存在多个严重问题,直接导致无限循环和未定义行为,逐个拆解:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:20:35