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)4.7.2

4

3 回答 3

6

编译器错误会告诉您究竟出了什么问题:

<(> 标记之前的预期标识符

您只能使用其名称(这是一个标识符)访问结构成员,而不是通过一些任意表达式。

于 2013-05-16T19:48:11.443 回答
1

检查本书的勘误表。

页。18,湖。-7 正确的表达式是(*a[0].field2)[3] = 99;

安德鲁李 12/31/10

我不确定20多年前首次出版的一本书有十几个错误(有些严重!)只是在去年才发现是一个好兆头还是坏兆头。

这本书可能很旧,但 Jeff Ullman 备受推崇。我记得几十年前他的编译器设计书籍让我的大脑舒展...

于 2013-05-16T21:07:56.253 回答
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.

于 2013-05-16T20:32:11.070 回答