首页 > 解决方案 > 请帮助我理解 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]);
}

标签: cpointers

解决方案


struct example_str
{
    int                 member1;
    struct example_str* member2[5];
};

example_str有 2 名成员和

  • member1int
  • member2struct 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


推荐阅读