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

如何通过函数参数创建并返回动态数组?遇段错误求助

问题分析与解决方法

段错误原因

函数createArray的参数int *ptr是值传递,你在函数内给ptr分配内存,修改的只是函数内部的局部变量副本,并不会改变main函数里array的指向。main里的array始终是NULL,后续访问array[i]必然触发段错误(SIGSEGV)——因为你在访问空指针指向的非法内存。


修复方案

方案一:使用指针的指针(传递指针的地址)

通过传递指针的地址,让函数能直接修改外部指针的指向:

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

void createArray(int **ptr, int n)
{
    *ptr = malloc(n * sizeof(int));
    // 检查内存分配是否成功,避免后续错误
    if (*ptr == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    for(int i = 1; i <= n; ++i)
    {
        (*ptr)[i-1] = i*i; // 下标写法更直观
    }
}

int main() {
    int *array = NULL;
    int n = 5;
    createArray(&array, n);
    for(int i = 0; i < n; ++i)
    {
        printf("%d ", array[i]);
    }
    free(array); // 释放动态内存,避免泄漏
    return 0;
}

方案二:让函数返回动态分配的指针

这种写法更直观,直接将malloc后的指针返回给调用者:

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

int* createArray(int n)
{
    int *ptr = malloc(n * sizeof(int));
    if (ptr == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    for(int i = 1; i <= n; ++i)
    {
        ptr[i-1] = i*i;
    }
    return ptr;
}

int main() {
    int *array = NULL;
    int n = 5;
    array = createArray(n);
    for(int i = 0; i < n; ++i)
    {
        printf("%d ", array[i]);
    }
    free(array);
    return 0;
}

额外提示

  • 必须检查malloc的返回值:如果内存分配失败,malloc会返回NULL,提前处理能避免后续非法内存访问。
  • 动态分配的内存使用完毕后,一定要用free()释放,防止内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:20:35