我有以下结构:
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
。
无论如何,我不清楚为什么您希望局部变量指定一个指针而不是一个结构。您可能确实想要这样做有一些潜在的原因,但显然其中任何一个都不适用。
关于c - 初始化静态结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34437849/