在C上初始化结构问题

时间:2012-08-10 14:26:45

标签: c struct initialization

我在编译期间收到此错误:

  

“c:\ command_line.h(17):错误C2143:语法错误:缺少';'在'*'之前   注意:C ++不支持default-int   command_line.h(17):错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int“

这是我的代码:

command_line.h

typedef struct symbol
{
    char* sym_type;
    unsigned short address;
}symbol;


typedef struct symbol_map
{
    char** p_arr_keys;
    symbol* p_arr_values;
    int item_count;
    int array_mode;
    int copy_keys;
}symbol_map;

typedef struct params
{
    int data_counter;
    int code_counter;
    int line_counter;
    int command_len;
    int error_counter;
    int warning_counter;
    symbol_map* p_symbol_map; // (This is line 17- from the error msg)
    char* p_last_symbol
}params;

的main.c

params config;
config.code_counter = 0;
config.data_counter = 0;
config.line_counter = 0;
config.command_len = 0;
config.command_first_char = EMPTY;
config.error_counter = 0;
config.warning_counter = 0;
config.p_last_symbol = NULL;
config.p_symbol_map = {NULL}; // (This is line 17- from the error msg)

知道这个初始化有什么问题吗?

 config.p_symbol_map = {NULL};

5 个答案:

答案 0 :(得分:1)

您使用config.p_symbol_map = {NULL}的构造是静态初始化,只允许在变量声明中使用。如果要为p_symbol_map分配NULL,则只需config.p_symbol_map = NULL

应用于symbol结构的静态初始化的有效情况如下:

symbol sym = {
   NULL,
   0x42
};

<强>更新

顺便说一下,在结构定义中char* p_last_symbol之后你缺少一个分号。


typedef struct params
{
    int data_counter;
    int 
    int line_counter;
    int command_len;
    int error_counter;
    int warning_counter;
    symbol_map* p_symbol_map; // (This is line 17- from the error msg)
    char* p_last_symbol  <----- need to add ; here
}params; 
 

答案 1 :(得分:0)

你不能那样做。您必须初始化配置AFAIK。您可以这样做,因为您要分配指针而不是结构。

config.p_symbol_map = NULL;

答案 2 :(得分:0)

您没有初始化结构,而是初始化指向结构的指针。

struct foo {
  int a;
  int b;
};

struct foo bar = {.a = 0, .b = 1};

但是如果你要声明一个指针,那么你最初没有内存块来初始化。因此,您无法使用{}惯用法初始化指向struct的指针;

struct foo *bar;
bar = NULL

答案 3 :(得分:0)

那里有些错误,您正在分配给p_last_symbol成员,而您未在params中声明。此外,p_symbol_map是指向某个内容的指针,您可以使用NULL对其进行初始化,也可以指向其他内容(例如使用malloc分配的内存)。

答案 4 :(得分:0)

{}周围NULL不需要NULL。只需使用nullptrp_symbol_map即可。那么struct symbol_map* p_symbol_map是什么?你的params声明中没有这样的东西。 此外,在第17行,它应该被视为:

{{1}}。这就是第17行出现错误的原因。

希望这会有所帮助。