如何使用printf()打印C语言自定义函数的运行结果?
代码存在的核心错误
sum类型定义错误:你写的int *sum = 0是定义了一个初始化为空的int型指针,后续sum += arr[i]是在给指针的地址值做偏移,不是做数值累加,最后对空指针解引用*sum会直接触发程序崩溃。累加和只需要定义为普通int类型变量,初始值设为0即可。- 数组长度计算逻辑完全错误:数组作为参数传入函数时会退化为指针,此时
sizeof(*arr)得到的是数组单个int元素的大小(通常为4字节),根本不是数组的实际元素个数5,循环次数不对自然算不出正确结果。C语言中数组传参不会自带长度信息,必须额外将数组长度作为参数传入函数。 - 调用写法语法错误:
arr是main函数中定义的数组名,不是函数,不能加()做调用;且你定义的foo返回值是void,本身没有返回值,不能直接作为printf的参数传入。
正确实现方案
你可以根据需求选两种实现方式:
方式1:在foo函数内部直接打印结果
只需要修正上述逻辑错误即可,代码如下:
#include <stdio.h> // 新增len参数传入数组实际长度 void foo(int arr[], int len){ int sum = 0; // 普通int类型存累加和 int product = 1; for(int i = 0; i < len; i++){ sum += arr[i]; } for(int i = 0; i < len; i++){ product *= arr[i]; } printf("数组元素和:%d\n", sum); printf("数组元素乘积:%d\n", product); } int main(){ int arr[] = {1,2,3,4,5}; // 在数组定义的作用域内计算长度:总空间大小/单个元素大小 int arr_len = sizeof(arr) / sizeof(arr[0]); foo(arr, arr_len); return 0; }
方式2:将计算结果返回main函数,通过main里的printf打印
C语言函数单次只能返回一个值,要同时拿到和与乘积,可以通过指针参数将结果带回main,代码如下:
#include <stdio.h> // res_sum、res_product是输出参数,用来把计算结果带回调用处 void foo(int arr[], int len, int *res_sum, int *res_product){ int sum = 0; int product = 1; for(int i = 0; i < len; i++){ sum += arr[i]; } for(int i = 0; i < len; i++){ product *= arr[i]; } *res_sum = sum; *res_product = product; } int main(){ int arr[] = {1,2,3,4,5}; int arr_len = sizeof(arr) / sizeof(arr[0]); int sum, product; // 传入变量地址,让foo把结果写入对应内存 foo(arr, arr_len, &sum, &product); // 此处直接用printf打印结果即可 printf("数组元素和:%d\n", sum); printf("数组元素乘积:%d\n", product); return 0; }
注意:永远不要在数组传参后的函数内部用
sizeof计算数组长度,数组退化是C语言的基础特性,这种写法得到的结果永远不是你想要的数组实际长度。
内容的提问来源于stack exchange,提问作者Augustin Negura
相关产品推荐
相关产品推荐

