c - 初始化静态结构

标签 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_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.bufferNULL

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

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

相关文章:

c - 如何在C中解析数组

javascript - 从Typescript中的实例访问静态方法

java - 为什么静态变量在线程之间共享

c++ - 将 std::vector emplace_back() 与 std::pair 与构造函数初始化列表一起使用

c编程默认参数: const struct vs init function

java - 网络编程中Java函数与C函数的等价

c - c语言中的可变长度数组替代

c++ - 项目符号 [dcl.init]/7 (7.1)

c - malloc 将内存转换为结构

c++ - C++中同时使用RAII代码和非RAII代码的问题如何解决?