gpt4 book ai didi

c - 指向未知或不完整结构的指针

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:02 25 4
gpt4 key购买 nike

这道题是考Why is it valid to define a type as pointer to an undefined struct in C?题的概念

我知道这不是一个有用的程序,请不要说“你没有定义这个那个”。讨论是关于不透明类型的指针算术。很抱歉打扰了太多人,但答案还是有用的。

这个程序:

struct st1 {
int a,b;
};

struct st2;

typedef struct st2 *foo;
typedef struct foo *bar;

void main(void) {
struct st1 *net=0;
foo ft1=0;
bar test=0;

net++;
ft1++;
test++;
}

用 gcc 编译时给出以下内容:

pc:~$ cc tmp2.c
tmp2.c: In function 'main':
tmp2.c:17:6: error: increment of pointer to unknown structure
ft1++;
^
tmp2.c:17:3: error: arithmetic on pointer to an incomplete type
ft1++;
^
tmp2.c:18:7: error: increment of pointer to unknown structure
test++;
^
tmp2.c:18:3: error: arithmetic on pointer to an incomplete type
test++;
^

我想更好地理解这里发生的事情,因为当不知道指针指向什么时,指针算术当然有点困难......

最佳答案

您已通过声明通知编译器您在程序中有一个 struct st2,但当时并没有定义它。那种向编译器 promise 它的定义将在稍后出现。

但是你还没有在任何地方定义它。

阅读here关于声明和定义之间的区别。

沿着函数原型(prototype)的思路思考。

喜欢

void fun(int);

你说函数 fun 返回 void 并接受 int 位于某处。如果您不在程序中调用此函数,也不会造成任何损害。

但是如果你调用它,你必须在某个地方定义它,比如

void fun(int a)
{ ... }

此处struct 的情况类似。如果您没有使用 struct st2(和 struct foo)类型的变量或其 typedef 编辑的名称,就不会有任何错误。

但如果您确实要使用它们,则必须定义它们,以便编译器知道它应该做什么。

关于c - 指向未知或不完整结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47250911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com