如何在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
相关产品推荐
相关产品推荐

