2013-05-16 41 views
2

此代码有什么问题?<(>令牌之前的预期标识符

#include "stdio.h" 

typedef int type1[10]; 

typedef type1 *type2; 

typedef struct { 
    int field1; 
    type2 field2; 
} type3; 

typedef type3 type4[5]; 

int main() {  
    type4 a; 
    a[0].(*field2[3]) = 99; // Line 16 
    return 0; 
} 

获得:main.c中:16:10:错误:预期标识符之前<(>令牌

gcc版本:GCC(GCC)4.7.2

+2

首先,它应该是'#include '。包含双引号的头文件与源文件位于同一目录中。 –

+0

Douglas B. Staple,感谢您的解释! –

+1

代码有什么问题?除了语法错误之外,它还有很多选择不当的名字。例如,针对指针的Typedef通常是一个糟糕的主意,并且名称'type1','type2','type3'和'type4'很糟糕。 –

回答

0

如果这确实来自一本书,那么它就是一个错字。分配一个int一些正确的表述是

*a[0].field2[3] = 99; 
*(a[0].field2)[3] = 99; 
*(a[0].field2[3]) = 99; 

一个工作程序将

#include <stdlib.h> 

typedef int type1[10]; 

typedef type1 *type2; 

typedef struct { 
    int field1; 
    type2 field2; 
} type3; 

typedef type3 type4[5]; 

int main(void) { 
    type4 a; 

    a[0].field1 = 99; 
    a[0].field2 = malloc (sizeof(type1)); 
    (*a[0].field2)[3] = 99; 

    return 0; 
} 

注意使用<stdlib.h>因为我们使用malloc

+0

在撰写最新评论时没有看到答案。试过第二个。编译是可以的。虽然该程序正在运行时下降。 –

+0

我认为这本书中的例子有问题。 – Jens

+0

程序崩溃,只要field2是一个指向int数组的指针,它不会指向任何地方。首先需要分配内存。 – Jens

6

编译器错误通知你究竟什么是错的:

expected identifier before <(> token

只能访问结构membe rs使用他们的名字(这是一个标识符),而不是一些任意的表达。

+0

这个例子取自“计算机科学基础”第16,18页。我认为这是对的,但现在我感到困惑。 –

+0

@ user2244092:该书中的代码是否意味着C,或者它是否以某种其他类似C的语言? –

+0

是的,这是C. –

1

检查errata for the book.

p. 18, l. -7 The correct expression is (*a[0].field2)[3] = 99;

Andrew Li 12/31/10

我不知道这是否是一个好的或坏的迹象,一本书首次出版于20年前有十几错误(一些显著!)仅在过去的一年中。

这本书可能会老,但杰夫乌尔曼是高度尊重。我记得几十年前他编译设计的书籍伸展我的大脑......

相关问题