处理5位以内正整数程序中,函数指针无法接收动态指针参数的问题
问题分析与解决
你的代码里不是malloc动态分配的指针传递失败,核心问题是outputDigit函数在统计位数时直接修改了*number的原始值——把它循环除以10直到变成0,导致后续outputNumber和outputReverseNumber拿到的数值是0,自然无法正确输出各位数字。
另外代码还有两处逻辑错误:
- 输入判断里,你限制了
*number >9999,但题目要求是不超过5位正整数,5位最大是99999,这里条件写错了。 outputNumber里的base计算逻辑有bug,当数字是1位时,base会是10,导致输出0。
修正后的代码
#include <stdio.h> #include <stdlib.h> void inputNumber(int *number){ printf("Enter number: "); scanf_s("%d", number); while(*number <= 0 || *number > 99999){ // 修正5位数字的上限 if(*number <= 0){ printf("The number is not positive integer! Retry!\nEnter number: "); } if(*number > 99999){ printf("The number is more than 5 digits! Retry!\nEnter number: "); } scanf_s("%d", number); } } void outputDigit(int *number, int *digit){ int temp = *number; // 用临时变量计算,不修改原数值 int i; for(i = 0; temp != 0; i++){ temp /= 10; } *digit = i; printf("The number is %d digits!\n", i); } void outputNumber(int *number, int *digit){ int base = 1; int temp = *number; // 修正base计算:得到10^(digit-1) for(int i = 1; i < *digit; i++){ base *= 10; } for(int i = 0; i < *digit; i++){ printf("%d ", temp / base); temp -= temp / base * base; base /= 10; } printf("\n"); } void outputReverseNumber(int *number, int *digit){ int temp = *number; for(int i = 0; i < *digit; i++){ printf("%d ", temp % 10); temp = (temp - temp % 10) / 10; } printf("\n"); } void function(int *number, int *digit, void (*fun[])(int*, int*)){ for(int i = 0; i < 3; i++){ fun[i](number, digit); } } int main(){ int *number = (int*)malloc(sizeof(int)); int *digit = (int*)malloc(sizeof(int)); void (*fun[3])(int*, int*) = {outputDigit, outputNumber, outputReverseNumber}; inputNumber(number); function(number, digit, fun); free(number); free(digit); system("pause"); return 0; }
关键修改点
- 保护原始数值:在
outputDigit中使用临时变量temp代替*number进行位数计算,避免破坏原输入值。 - 修正输入上限:把
*number >9999改成*number >99999,符合5位数字的要求。 - 修复base计算逻辑:将base初始化为1,循环
digit-1次乘以10,确保不同位数的数字都能正确计算最高位的除数。
现在你的代码可以正常通过函数指针调用各个功能,malloc分配的指针也能正确传递参数了。
内容的提问来源于stack exchange,提问作者Navy Zhang
相关产品推荐
相关产品推荐

