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

如何在C语言函数内使用malloc/calloc并解决动态数组段错误问题

错误原因与修复方案

核心错误点

  • 指针类型误用:你要实现的是一维动态float数组,不需要二级指针float** T,直接用一级指针float* T即可。你当前初始化T为NULL后直接解引用*T,相当于操作空指针指向的内存,直接触发段错误。
  • 判空逻辑错误:你分配内存后判断的是!T,而不是判断刚分配的内存地址是否为空,无法正确捕获内存分配失败的情况。
  • 指针访问逻辑错误:*(T+i)、(T+i)对于二级指针来说是float*类型,你直接用来存float值、传给scanf当float地址用,类型完全不匹配。

修正后的完整代码

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

int n = 0;
// 改用一级指针存储一维float数组
float* T = NULL;

void show_table(int n){
    printf("Show Table: \n");
    for (int i = 0; i < n; i++) {
        // 直接访问数组元素
        printf("%f ", T[i]);
    }
    printf("\n");
}

void fill_table(int n) {
    // 直接给T分配n个float大小的内存
    T = (float*)calloc(n, sizeof(float));
    // 判断分配结果
    if (!T){
        printf("Memoire not allowe\n");
        exit(0);
    }
    for (int i = 0; i < n; i++) {
        printf("\nT[%d]= ", i+1);
        // 传入元素的地址
        scanf("%f", &T[i]);
    }
}

int main() {
    printf(" Table dimension: ");
    scanf("%d", &n);
    fill_table(n);
    show_table(n);
    // 用完释放内存避免泄漏
    free(T);
    T = NULL;
    return 0;
}

额外说明

如果你确实需要使用二级指针float** T的场景(比如后续要扩展为二维数组),那需要先给T本身分配内存,再给*T分配内存,示例如下:

// 二级指针方案示例
float** T = NULL;
void fill_table(int n) {
    // 先给T分配一级指针的空间
    T = (float**)malloc(sizeof(float*));
    if(!T) {
        printf("Mem alloc fail\n");
        exit(0);
    }
    // 再给*T分配float数组空间
    *T = (float*)calloc(n, sizeof(float));
    if(!*T) {
        printf("Mem alloc fail\n");
        exit(0);
    }
    // 访问元素要写 (*T)[i]
    for (int i = 0; i < n; i++) {
        printf("\nT[%d]= ", i+1);
        scanf("%f", &(*T)[i]);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:18:03