C 初始化静态结构

C 初始化静态结构,c,static,initialization,structure,C,Static,Initialization,Structure,我的结构如下: 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_pt

我的结构如下:

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

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

您正在尝试使用不是指针而是结构的值初始化指针。这不可能奏效

此外,具有静态存储持续时间的对象的初始值设定项必须是编译时常量。当您认识到这些对象的初始化(逻辑上)发生在程序执行开始之前时,此约束是有意义的。所有文件作用域变量都有静态持续时间,声明的局部变量
static
,如您的
请求\u ptr
,也有静态持续时间。您试图用一个不是编译时常量的值初始化静态指针

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

void somefunction(const SRequest* request)
{
    SRequest local_request = {.buffer = request->buffer, 
                              .bufferLength = 0};
    .
    .
    .
}
请注意,我将
local\u 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\u request
的成员适合替代
initialized
变量,则您可能可以不使用该变量。例如,也许测试天气
local\u请求对您有用。buffer
NULL


在任何情况下,我都不清楚为什么希望局部变量指定指针而不是结构。你可能确实想要这样做,这可能有一些潜在的原因,但这些原因中的任何一个都不适用。

由于这个问题的标题似乎比特伦斯·希尔(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};
}

“另一种方式”是什么意思?检查空值并使用malloc()?您需要为指针分配内存,请看,我指的是初始化请求的另一种方法,而不是此方法:静态SRequest*request\u ptr={.buffer=request->buffer.bufferLength=0};我的意图不是将缓冲区指针初始化为null,而是将指针指向一个有效的初始化结构。指针就是指针。它必须指向真实的东西。为什么需要
请求\u ptr
?您打算以后如何使用该指针?以这种方式使用复合文字有点酷,但在这里不起作用,因为初始值设定项不是编译时常量。此外,当您可以直接声明数据时,声明指向(必须)静态或未引用数据的静态指针有点迂回(即,
静态请求数据=…
)并在需要时通过操作员的地址获取指向它的指针。