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

C语言实现返回数组功能时程序崩溃,如何正确完成数组返回操作?

C语言返回数组实现方案及问题修复

崩溃核心原因

你代码中返回的tempArray是duplicates函数内部定义的栈上局部数组,C语言中栈空间的局部变量会在函数执行结束后自动回收,返回的地址属于非法内存,main函数访问该地址时触发内存访问错误直接崩溃。
Java的数组默认在堆内存分配由GC管理生命周期,和C的栈内存规则完全不同,这是两类语言的核心差异。

正确返回数组的两种常用实现方式

方式1:函数内堆动态分配数组返回

堆内存的生命周期由开发者手动控制,只要不主动释放就可以跨函数访问:

#include <stdio.h>
#include <stdlib.h>

// 第二个参数n是原数组长度,第三个参数用来接收返回的重复元素数组长度
int * duplicates(int[],int, int*);

int main() {
    int arr[] = {3,5,6,5,9,5,10,11,3};
    int n = sizeof(arr)/sizeof(arr[0]);
    int res_len = 0;

    int * resArray = duplicates(arr, n, &res_len);

    for (int i = 0; i < res_len; i++) {
        printf("%d \t", resArray[i]);
    }
    // 堆内存使用完必须手动释放,避免内存泄漏
    free(resArray);
    return 0;
}

int * duplicates(int arr[], int n, int* res_len) {
    // 堆上分配数组,最大长度不可能超过原数组长度n
    int *tempArray = (int*)malloc(sizeof(int) * n);
    int r = 0;
    for (int i = 0; i < n; i++) {
        int flag = 0;
        // 先判断当前元素是不是已经加入过结果集
        for(int k = 0; k < r; k++) {
            if(arr[i] == tempArray[k]) {
                flag = 1;
                break;
            }
        }
        if(flag) continue;
        // 再判断后续有没有重复元素
        for (int j = i+1; j < n; j++) {
            if (arr[i] == arr[j]) {
                tempArray[r++] = arr[i];
                break;
            }
        }
    }
    *res_len = r;
    return tempArray;
}

方式2:外部传入预分配数组

由调用方提前分配好数组空间(栈、堆都可以),函数直接往传入的地址里写入结果,不需要管理内存分配:

#include <stdio.h>

// 第三个参数是外部传入的结果数组地址,第四个参数接收结果长度
void duplicates(int[],int, int[], int*);

int main() {
    int arr[] = {3,5,6,5,9,5,10,11,3};
    int n = sizeof(arr)/sizeof(arr[0]);
    int resArray[n]; // 栈上预分配结果数组
    int res_len = 0;

    duplicates(arr, n, resArray, &res_len);

    for (int i = 0; i < res_len; i++) {
        printf("%d \t", resArray[i]);
    }
    return 0;
}

void duplicates(int arr[], int n, int tempArray[], int* res_len) {
    int r = 0;
    for (int i = 0; i < n; i++) {
        int flag = 0;
        for(int k = 0; k < r; k++) {
            if(arr[i] == tempArray[k]) {
                flag = 1;
                break;
            }
        }
        if(flag) continue;
        for (int j = i+1; j < n; j++) {
            if (arr[i] == arr[j]) {
                tempArray[r++] = arr[i];
                break;
            }
        }
    }
    *res_len = r;
}

内容的提问来源于stack exchange,提问作者VenoM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 18:54:07