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

C语言float数组指针传参无有效数据,运行仅输出全零是什么原因?

代码问题排查及修复

你代码的错误集中在4个核心点:

  • 函数传参逻辑错误:C语言默认值传递,ScansFloat函数里的arr是实参的副本,你在函数内给arr赋值malloc返回的地址,不会修改main函数里的arr变量,main里的arr始终是初始化的空指针(值为0)。
  • 内存申请逻辑错误:你要存储float类型数据,malloc时却按int的大小申请空间,还把返回值强转为int*,类型完全不匹配,就算传参正确也会出现内存访问异常。
  • 打印逻辑两处错误:
    1. 循环边界错误,数组下标范围是0 ~ size-1,你从i=size开始访问属于越界读内存,会触发未定义行为
    2. 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));
    }
}

核心修改说明

  1. 把ScansFloat的第一个参数改为二级指针float** arr,传入main中arr的地址,这样就可以在函数内修改main中arr的指向,拿到malloc申请的内存地址
  2. 内存申请改为malloc(size * sizeof(float)),匹配存储float的需求,不需要对malloc返回值做强制类型转换(C语言标准允许void*隐式转换为其他指针类型)
  3. 调整打印的循环边界为i = size-1,输出时加解引用符*拿到数组元素的值
  4. 增加free调用释放堆内存,避免泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:24:10