【问题标题】:Getting pointer's initialization of defined structs as global variables将已定义结构的指针初始化为全局变量
【发布时间】:2015-04-09 12:56:45
【问题描述】:

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

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. 我已经使用sizeof() 运算符(例如#define hs_icmp sizeof(struct icmp))为每个结构(例如hs_icmp, hs_icmp6, hs_ip, ...)定义了这个大小。

当我编译时,我得到每个头结构指针的错误,我不知道如何解决它,例如:

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

【问题讨论】:

    标签: c pointers memory struct network-programming


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是一个很好的评论(我猜也一样),但我不确定这是一个很好的答案。
    • 是的,确切地说,我已将它们声明为全局变量。那么有错误吗?
    【解决方案2】:

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

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多