将指针结构的指针初始化作为全局变量

时间:2015-04-09 12:56:45

标签: c pointers memory struct network-programming

我想为不同的标头结构指针保留内存以填充它,如下所示:

struct  icmp      *_icmp_hdr = (struct icmp *) Smalloc(hs_icmp, 0);   
struct  icmp6_hdr *_icmp6 = (struct icmp6_hdr *) Smalloc(hs_icmp6, 0);
struct  ip        *_ip_hdr = (struct ip *) Smalloc(hs_ip, 0);
struct  ip6_hdr   *_ip6_hdr = (struct ip6_hdr *) Smalloc(hs_ip6, 0);
union   data_err  *_payload = (union data_err *) Smalloc(s_payload, 0);

当标题的大小结构为:struct icmp, icmp6_hdr, ip...

时,问题就出现了
  1. 我已经定义了它的显示,这个大小适用于使用hs_icmp, hs_icmp6, hs_ip, ...运算符的每个结构(例如sizeof())(例如#define hs_icmp sizeof(struct icmp))。
  2. 当我编译时,我得到每个标头结构指针的错误,我不知道如何解决它,例如:

    error: initializer element is not constant
    struct icmp    *_icmp_hdr = (struct icmp *) Smalloc(hs_icmp, 0);
                                        ^
    

2 个答案:

答案 0 :(得分:0)

您不能将函数调用作为全局变量的初始化表达式的一部分。

这是错误消息告诉您的内容。

结构的大小与它无关(并且结构的大小不能为0)。

答案 1 :(得分:0)

您正尝试使用非常量表达式初始化全局变量。例如,你不能这样做:

#include <stdio.h>
int a = 0;
int b = a; //error: initializer element is not constant
int main(void) {
    // your code goes here
    return 0;
}

但你可以这样做:

#include <stdio.h>
int a = 0;
int main(void) {
    int b = a; //OK
    return 0;
}

或者这个:

#include <stdio.h>
#define A 0
int b = A; //OK
int main(void) {        
    return 0;
}