C语言float数组指针传参无有效数据,运行仅输出全零是什么原因?
代码问题排查及修复
你代码的错误集中在4个核心点:
- 函数传参逻辑错误:C语言默认值传递,
ScansFloat函数里的arr是实参的副本,你在函数内给arr赋值malloc返回的地址,不会修改main函数里的arr变量,main里的arr始终是初始化的空指针(值为0)。 - 内存申请逻辑错误:你要存储float类型数据,malloc时却按
int的大小申请空间,还把返回值强转为int*,类型完全不匹配,就算传参正确也会出现内存访问异常。 - 打印逻辑两处错误:
- 循环边界错误,数组下标范围是
0 ~ size-1,你从i=size开始访问属于越界读内存,会触发未定义行为 printf输出float值时传入的是arr+i(地址值),没有解引用,相当于把内存地址当float值打印,自然会出现异常值
- 循环边界错误,数组下标范围是
- 没有释放malloc申请的内存,存在内存泄漏问题
修正后可运行代码
#include <stdio.h> #include <stdlib.h> void ScansFloat(float** arr, int size); void PrintsFloat(float* arr, int size); int main() { float* arr = NULL; ScansFloat(&arr, 5); PrintsFloat(arr, 5); free(arr); // 释放申请的内存 arr = NULL; return 0; } void ScansFloat(float** arr, int size) { // 传入二级指针修改main中arr的指向 *arr = malloc(size * sizeof(float)); for (int i = 0; i < size; i++) { printf("Enter number in position %d\n", i+1); scanf("%f", *arr + i); } } void PrintsFloat(float* arr, int size) { // 从最后一个元素下标size-1开始遍历,到0结束 for (int i = size - 1; i >= 0; i--) { // 解引用拿到元素值 printf("Number %d is %f\n", size - i, *(arr + i)); } }
核心修改说明
- 把
ScansFloat的第一个参数改为二级指针float** arr,传入main中arr的地址,这样就可以在函数内修改main中arr的指向,拿到malloc申请的内存地址 - 内存申请改为
malloc(size * sizeof(float)),匹配存储float的需求,不需要对malloc返回值做强制类型转换(C语言标准允许void*隐式转换为其他指针类型) - 调整打印的循环边界为
i = size-1,输出时加解引用符*拿到数组元素的值 - 增加free调用释放堆内存,避免泄漏
内容的提问来源于stack exchange,提问作者adirk1
相关产品推荐
相关产品推荐

