c - 请帮助我理解 RefTest() 中生成的警告。[-Wincompati
问题描述
警告:从具有不兼容返回类型'struct example_str *'的函数返回'struct example_str **' [-Wincompatible-pointer-types] return &(example1_str->member2[index]);
请帮助了解生成警告的原因。当调用 example1_struct->member[index] 时,我的理解是它应该返回 (struct example_struct*) 请帮助我理解警告的原因。先感谢您。
#include <stdio.h>
#include "stdbool.h"
struct example_str{
int member1;
struct example_str* member2[5];
};
struct example_str* Reftest(int index);
void function2(int id, int* SigVal);
struct example_str* example1_str;
int main()
{
_Bool test;
int Val = (int) test;
function2(10,&Val);
return 0;
}
void function2(int id, int* SigVal){
struct example_str* ptr_to_str;
ptr_to_str = Reftest(1);
ptr_to_str -> member2[1] -> member1 = id;
printf("%d",ptr_to_str -> member2[1] -> member1);
}
struct example_str* Reftest(int index){
return &(example1_str->member2[index]);
}
解决方案
struct example_str
{
int member1;
struct example_str* member2[5];
};
example_str
有 2 名成员和
member1
是int
member2
是struct example_str*[5]
,也就是一个由 5 个指向struct example_str
、 从member2[0]
到的指针组成的数组member2[4]
。5个指针。
refTest
返回struct example_str*
, 相同类型的每个member2
您可以对齐声明以更好地查看
struct example_str
{
int member1;
struct example_str* member2[5];
};
struct example_str* Reftest(int index);
所以很明显,无论member2
是什么,Reftest()
返回都是一样的。
所以如果你像你一样声明
struct example_str* Reftest(int index)
{
return &(example1_str->member2[index]);
}
与&
操作员一样address of
,您返回的地址member2[]
本身就是一个指针 --- struct example_str*
--- 并且肯定它的类型是struct example_str**
编译器说
so0729.c:35:12: warning: returning 'struct example_str **' from a function
with incompatible return type
struct example_str *' [-Wincompatible-pointer-types]
35 | return &(example1_str->member2[index]);
| ^~~~~~~~~~~~~~
它就是这样。&
脱掉就行了
考虑使用typedef
. 这很常见,可以使代码更易于阅读。并避免在外部声明全局事物main()
例子
这是您的代码的变体,使用指针将引用来回传递给结构
#include <stdio.h>
typedef struct st_example_str
{
int member1;
struct st_example_str* member2[5];
} Example;
Example* Reftest(Example*, unsigned);
void function2(Example*, unsigned, int* SigVal);
int main()
{
Example A = {.member1 = 10};
Example B = {.member1 = 11};
Example C = {.member1 = 12};
Example D = {.member1 = 13};
Example E = {.member1 = 14};
Example ex1;
ex1.member1 = 1;
ex1.member2[0] = &A;
ex1.member2[1] = &B;
ex1.member2[2] = &C;
ex1.member2[3] = &D;
ex1.member2[4] = &E; // not used
C.member2[0] = &ex1; // cycle
D.member2[0] = &ex1; // cycle
E.member2[0] = &ex1; // cycle
char test = 42;
int Val = (int)test;
function2(&ex1, 2, &Val); // should set member1 of C to 42...
printf("ids (member1) pointed from the array inside ex1: ");
for (int i = 0; i < 5; i += 1)
printf("%d ", ex1.member2[i]->member1);
printf("\n");
printf("member1 for ex1: %d\n", ex1.member1);
return 0;
}
void function2(Example* E, unsigned id, int* SigVal)
{
// sets member1 of struct pointed by E->member[id] to
// the value pointed to by SigVal
Example* ptr_to_str = Reftest(E, id);
ptr_to_str->member2[0]->member1 = *SigVal;
}
Example* Reftest(Example* E, unsigned index)
{
return E->member2[index];
}
示例输出
ids (member1) pointed from the array inside ex1: 10 11 12 13 14
member1 for ex1: 42
您会看到 42 的值是使用一些引用test
设置的ex1
推荐阅读
- javascript - 引导表样式不适用于 window.print();
- javascript - 非法退货声明
- protractor - 浏览器堆栈测试结果仪表板 Rest API 结果列显示未标记
- java - 如何在存储的 Mongo DB 图像上进行 Tesseract Ocr
- rspec - Rspec:如何期望表内的href链接
- asp.net-core - 路由:iis 不工作/独立工作 - asp.net core 3.0
- html - 是否可以在 HTML 中初始化表单而不必单独初始化所有输入字段?
- python - Pandas : filter the rows based on a column containing lists
- google-chrome - 如何删除 PWA 图标上的 Chrome Android 徽章
- ios - 必须从 Xcode 11.2 中的主线程使用获取警告,并且应用程序崩溃,在 Xcode 10.2 中未收到警告