【问题标题】:C Array initialisation: tmp.c:5: error: expected expression before ‘{’ tokenC 数组初始化:tmp.c:5:错误:“{”标记之前的预期表达式
【发布时间】:2013-01-05 10:43:49
【问题描述】:

我尝试了以下方法:

#include <stdio.h>

int main(void) {
     char multi[3][10];
     multi[0] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
     multi[1] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
     multi[2] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
     printf("&multi[2][2]: %d \n", (int) &multi[2][2]);
     printf("(*multi + 2) + 2: %d \n" , (int) (*multi + 2) + 2);
}

并产生了这个输出:

dominik@luna:~$ gcc tmp.c 
tmp.c: In function ‘main’:
tmp.c:5: error: expected expression before ‘{’ token
tmp.c:6: error: expected expression before ‘{’ token
tmp.c:7: error: expected expression before ‘{’ token

我已经做了一些研究,发现this thread Vladimir 声明“您应该在声明它们的同一行中初始化您的数组”。这仍然让我感到困惑,是不是你不应该像你不应该写意大利面条代码那样这样做,还是意味着你不能这样做。

或者是我做错了什么?

【问题讨论】:

  • 这意味着您必须在与声明相同的语句中对其进行初始化。合并四个语句。
  • 注意;使用%p printf 指针,不要大小写为(int)

标签: c arrays gcc multidimensional-array


【解决方案1】:

数组可以用这种方式初始化,但不能赋值。

#include <stdio.h>

int main(void) {
     char multi[3][10] = {
         {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'},
         {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'},
         {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}
     }
     printf("&multi[2][2]: %d \n", (int) &multi[2][2]);
     printf("(*multi + 2) + 2: %d \n" , (int) (*multi + 2) + 2);
}

另外请注意,这将截断您打印出来的堆栈地址,至少在 64 位系统上是这样。您是否要打印出堆栈地址?这样做:

printf("&multi[2][2]: %p\n", (char *) &multi[2][2]);
printf("(*multi + 2) + 2: %p\n" , (char *) (*multi + 2) + 2);

在我的系统上,此更改将导致它打印正确的地址,这些地址正好在 247(高于0x7fff00000000),超出了int 的范围。

【讨论】:

  • 如果它们是真的堆栈地址,那么截断对于打印的目的可能并不重要。
  • 同意——但低位 32 位通常非常擅长区分变量。也就是说,在开始接近 4GB 限制之前,您不会开始得到错误的重复。
  • @JanDvorak:好吧,我们在这里假设我们正在使用它来区分变量。由于生日悖论,碰撞将比 4 GiB 更早发生,具体取决于分配模式、月相和 ASLR。
猜你喜欢
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2012-07-08
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多