【发布时间】:2014-11-14 06:33:42
【问题描述】:
我在一个遗留项目中看到了以下代码。
/* token.c */
struct token id_tokens[MAX_TOKENS];
/* analyse.c (v1) */
extern struct token *id_tokens; /* Raised my eyebrow, id_token declares a pointer */
我坚持要更改analyse.c 以包含如下声明:
/* analyse.c (v2) */
extern struct token id_tokens[]; /* I am happy with this. id_tokens declares array of unspecified size. */
我想要v2,因为pointer to T 与array of T 不同。我朋友的反驳说两者的行为是一样的,所以我使用v1和v2都没有关系。
问题一:不完整类型的数组会耗尽指针吗?
问题 2:我的朋友认为这两个版本在行为上是相同的吗?
【问题讨论】:
-
见this 数组不是指针很多重复,我知道这是什么混乱,在某种程度上,你和你的朋友都错了
-
数组和指针可以互换使用,因为数组只是内存中一行中一组相同类型的变量,而指针只是指向一组变量的第一个元素同一类型在内存中的一行。这就是为什么
char *foo与char foo[]相同 -
@Gophyr 你说的是我朋友的语言。检查下面的答案。它们确实不同。
-
@GyaptiJain 从技术上讲,数组也只是指向内存空间开头的指针。两种情况下的内存是一样的,只是代码中的表现看起来不同。
-
然而,数组有一个确定的大小与之关联,但它可能会被溢出,即缓冲区溢出等。
标签: c language-lawyer extern declaration