返回指针的函数赋值报错:指针类型不兼容问题求助
问题分析与解决
问题描述
尝试运行一个返回指针的函数,在主函数中存储其返回值时出现错误,疑惑是否应该使用指向指针的指针来处理该函数的返回值。
原代码
#include <stdio.h> #include <wiringPi.h> int **ptr; int **ptr1; int* readfunc (int storage[33]){ storage[0] = digitalRead(D0)+48; storage[1] = digitalRead(D1)+48; storage[2] = digitalRead(D2)+48; storage[3] = digitalRead(D3)+48; storage[4] = digitalRead(D4)+48; storage[5] = digitalRead(D5)+48; storage[6] = digitalRead(D6)+48; storage[7] = digitalRead(D7)+48; return storage; } int* readfunc2 (int storage2[33]){ storage2[0] = digitalRead(D0)+48; storage2[1] = digitalRead(D1)+48; storage2[2] = digitalRead(D2)+48; storage2[3] = digitalRead(D3)+48; storage2[4] = digitalRead(D4)+48; storage2[5] = digitalRead(D5)+48; storage2[6] = digitalRead(D6)+48; storage2[7] = digitalRead(D7)+48; return storage2; } int main(){ ptr = &readfunc2; ptr1 = &readfunc; return 0; }
报错信息
assignment to ‘int **’ from incompatible pointer type ‘int * (*)(int *)’ [-Wincompatible-pointer-types] 44 | ptr = &readfunc2; warning: assignment to ‘int **’ from incompatible pointer type ‘int * (*)(int *)’ [-Wincompatible-pointer-types] 45 | ptr1 = &readfunc;
问题根源与解决方法
1. 类型不匹配的核心原因
你定义的int **ptr是指向int指针的指针,而&readfunc2是函数指针,类型为int *(*)(int *)(指向返回int*、参数为int数组的函数的指针),两者属于完全不同的类型,因此编译器抛出类型不兼容的警告。
2. 两种正确的处理方式
根据你的需求,分两种情况处理:
情况一:存储函数的地址(使用函数指针)
如果你的目的是保存函数本身的地址(比如后续通过指针调用函数),需要将ptr和ptr1定义为对应的函数指针类型:
// 方法1:先typedef定义函数指针类型,便于复用 typedef int* (*ReadFuncPtr)(int[]); ReadFuncPtr ptr; ReadFuncPtr ptr1; // 方法2:直接定义函数指针 int* (*ptr)(int[]); int* (*ptr1)(int[]);
赋值时,函数名本身就是地址,无需加&(加了也合法,但通常省略):
ptr = readfunc2; ptr1 = readfunc;
情况二:存储函数的返回值(即返回的数组指针)
如果你的目的是保存函数返回的int*(也就是传入的数组的地址),需要将ptr和ptr1定义为int*,同时要先创建作为参数的数组(函数内部操作的是你传入的数组):
int main(){ int storage[33]; // 创建用于存储数据的数组 int* ptr = readfunc(storage); // 存储函数返回的数组指针 int* ptr1 = readfunc2(storage); // 后续可以通过ptr访问storage数组的内容 return 0; }
注意:这里返回的指针指向的是栈上的数组storage,只要main函数未结束,该指针就有效。
3. 额外优化建议
readfunc和readfunc2的逻辑完全重复,可以合并为一个函数,减少冗余代码:
int* readDigitalPins(int storage[33]){ storage[0] = digitalRead(D0)+48; storage[1] = digitalRead(D1)+48; storage[2] = digitalRead(D2)+48; storage[3] = digitalRead(D3)+48; storage[4] = digitalRead(D4)+48; storage[5] = digitalRead(D5)+48; storage[6] = digitalRead(D6)+48; storage[7] = digitalRead(D7)+48; return storage; }
内容的提问来源于stack exchange,提问作者red
相关产品推荐
相关产品推荐

