我有以下结构:
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};
}