【问题标题】:C compile error Variable-sized object may not be initialized with char * ptr[buflen]C 编译错误 Variable-sized object may not be initialized with char * ptr[buflen]
【发布时间】:2016-01-06 13:25:52
【问题描述】:

是的,我确实阅读了这两篇文章。

C compile error: "Variable-sized object may not be initialized" C error "variable-sized object may not be initialized"

我的情况有点不同,因为我使用的是char * ptr[buflen]。这是我尝试过的:

char  *ptr[buflen] = {0};  //This gave me the variable sized object error. 

char  *ptr[buflen];
memset( ptr, 0, buflen*buflen*sizeof(char)); //I figured this would work with looking at the previous examples. 

//This seemed to work but I am curious if I need to use free or malloc
after looking at the previous examples. I don't want this to seg fault later
in the program and have no clue what is causing it. 
char  *ptr[buflen]; 
memset(ptr, 0, sizeof ptr);

char *strings_line_tokens[503] = {0}; //Why does this work but the above won't work? 

【问题讨论】:

  • memset(ptr, 0, buflen*sizeof(char *))。虽然技术上 NULL-ptr 不必为零,所以您应该可能 只需使用循环来初始化所有指针。
  • char *ptr[buflen] = {0} 应该是char *ptr[buflen] = {NULL}
  • @DavidC.Rankin:为什么自行车脱落?在这种情况下也是一样的。
  • @DavidC.Rankin:听起来你使用了损坏的编译器。
  • 是的,但无论如何你都不能初始化可变长度数组!

标签: c compiler-errors initializer-list variable-length-array


【解决方案1】:

我的情况有点不同,因为我使用的是 char * ptr[buflen]。

不是真的。您将ptr 声明为buflen 大小的char * 数组。如果buflen 不是一个常量表达式,那么ptr 是一个可变长度数组,你不能对可变长度数组使用初始化器:

6.7.9 初始化
...
3 要初始化的实体类型应该是一个未知大小的数组或一个完整的 不是可变长度数组类型的对象类型

添加了重点。

所以,很简单,

char *ptr[buflen] = {0};

不是合法的初始化。

如果要将ptr的所有元素初始化为0NULL,则可以使用memset

memset( ptr, 0, sizeof *ptr * buflen ); // note memset writes 0 to all *bytes* in 
                                        // in the array 

或者你会在一个循环中分配每个元素:

for ( size_t i; i < buflen; i++ )
  ptr[i] = NULL; // or 0, or some other pointer value

【讨论】:

  • 所以这没有达到我的预期memset(ptr, 0, sizeof ptr);?它没有给我任何编译器警告,也没有段错误。
  • @rocker:混蛋。让我解决这个问题。
  • @rocker:我的错 - 那行应该是memset( ptr, 0, sizeof *ptr * buflen);。我最近一直在使用指向数组的指针与指针数组,并让我的电线交叉。
猜你喜欢
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2019-04-29
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多