【问题标题】:Initialize static structure初始化静态结构
【发布时间】:2015-12-23 14:29:42
【问题描述】:

我有以下结构:

typedef struct
{
    uint8* buffer;
    uint32 bufferLength;
} SRequest;

还有一个功能:

void somefunction(const SRequest* request)
{
    //The following initialization of the pointer to static structure is not working
    static SRequest* request_ptr = {.buffer = request->buffer, 
                                    .bufferLength = 0};
    .
    .
}

还有其他方法可以初始化 request_ptr 吗?

【问题讨论】:

  • “另一种方式”是什么意思?检查 NULL 并使用 malloc()?
  • 需要给指针分配内存,看这个stackoverflow.com/questions/11709929/…
  • 我的意思是另一种初始化 request_ptr 的方法,而不是这个: static SRequest* request_ptr = {.buffer = request->buffer, .bufferLength = 0};我的意图不是将缓冲区指针初始化为 NULL
  • 您必须将指针指向一个有效的、已初始化的结构。 pointer 就是一个pointer。它必须指向真实的东西。
  • 为什么需要request_ptr?您打算以后如何使用该指针?

标签: c static initialization structure


【解决方案1】:

您正在尝试使用不是指针而是struct 的值来初始化指针。那不可能。

此外,具有静态存储持续时间的对象的初始化程序必须是编译时常量。当您认识到此类对象的初始化(逻辑上)在程序执行开始之前发生时,此约束是有意义的。所有文件范围的变量都具有静态持续时间,声明为static 的局部变量也是如此,例如您的request_ptr。您正在尝试使用不是编译时常量的值来初始化静态指针。

这里不清楚你真正追求的是什么,但如果你试图在每次调用时创建一个 SRequest 指向与参数相同的缓冲区,那么可能是这样的:

void somefunction(const SRequest* request)
{
    SRequest local_request = {.buffer = request->buffer, 
                              .bufferLength = 0};
    .
    .
    .
}

请注意,我将local_request 设为自动变量而不是静态变量,以便在每次调用时应用其初始化程序,并且我将其设为struct,而不是指向变量的指针。

另一方面,如果您的目标是让SRequest 在第一次调用函数时使用从该调用的参数派生的值进行初始化,然后在函数调用中持续存在,那么您需要类似这个:

void somefunction(const SRequest* request)
{
    static int initialized = 0;
    static SRequest local_request;

    if (!initialized) {
        local_request.buffer = request->buffer;
        local_request.buffer_length = 0;
        initialized = 1;
    }
    .
    .
    .
}

如果local_request 的成员适合代替initialized 变量,您也许可以不用它。例如,也许它会为您的目的而工作,而不是测试天气 local_request.bufferNULL

无论如何,我不清楚你为什么希望局部变量指定一个指针而不是一个结构。您可能确实需要这样做的原因有很多,但目前尚不清楚其中任何一个都适用。

【讨论】:

    【解决方案2】:

    由于问题的标题似乎比 terence hill 引用的问题更明确,因此在这里找到答案可能会很有趣。

    您必须使用 C99 标准中定义的“复合文字”:

    void somefunction(const SRequest* request)
    {
        //The following initialization of the pointer to static structure is not working
        static SRequest* request_ptr = &(SRequest){
            .buffer = request->buffer,
            .bufferLength = 0};
    }
    

    【讨论】:

    • 以这种方式使用复合文字有点酷,但在这里不起作用,因为初始化程序不是编译时常量。
    • 另外,声明一个指向(必然)静态和其他未引用数据的静态指针有点迂回,而您可以直接声明数据(即static SRequest request_data = ...)并获取指向它的指针在需要时通过地址操作符。
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2021-01-31
    • 2015-10-30
    • 1970-01-01
    • 2013-09-22
    • 2011-01-07
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多