C语言 初始化静态结构



我有以下结构:

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?

您正在尝试使用不是指针而是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.buffer NULL

无论如何,我不清楚为什么您希望局部变量指定指针而不是结构。 您可能确实想要这样做,但这些原因并不明显。

由于问题的标题似乎比特伦斯·希尔引用的标题更明确,因此在这里找到答案可能会很有趣。

您必须使用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};
}