我有以下结构:

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

是否有其他方法可以初始化请求?

最佳答案

您试图用一个不是指针而是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;
    }
    .
    .
    .
}

如果initialized中的某个成员可以代替它,则可以不使用local_request变量。例如,为了您的目的,也许可以测试天气local_request.buffer是否NULL
在任何情况下,我都不清楚为什么要让局部变量指定指针而不是结构。有一些潜在的原因,你可能真的想要,但这并不明显,任何这些适用。

关于c - 初始化静态结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34437849/

10-11 23:11
查看更多