我有以下结构:
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吗?
答案 0 :(得分:2)
您正在尝试初始化一个指针,该指针的值不是指针而是struct
。这不可行。
此外,具有静态存储持续时间的对象的初始化程序必须是编译时常量。当您在程序执行开始之前发现(逻辑上)发生此类对象的初始化时,此约束是有意义的。所有文件范围变量都具有静态持续时间,声明为static
的局部变量也是如此,例如request_ptr
。您正在尝试使用不是编译时常量的值初始化静态指针。
目前还不清楚你真正追求的是什么,但是如果你想在每次调用时创建一个SRequest
指向与参数相同的缓冲区,那么可能是这样的:< / p>
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;
}
.
.
.
}
如果initialized
的成员适合替代local_request
,您可以不使用local_request.buffer
变量。例如,也许它可以用于您的目的而不是测试天气NULL
是<Window x:Class="SDITicketAudit.UIWindows.WaitingScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:gif="http://wpfanimatedgif.codeplex.com"
gif:ImageBehavior.AnimateInDesignMode="True"
Title="Running Audits" ResizeMode="CanMinimize" Height="118.071" Width="245.6"
WindowStartupLocation="Manual" Left="50" Top="100">
<Grid>
<TextBlock x:Name="loadUpdates" HorizontalAlignment="Center" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Height="44" Width="220"/>
<Image gif:ImageBehavior.RepeatBehavior="Forever"
gif:ImageBehavior.AnimatedSource="pack://application:,,,/Resources/ajax-loader.gif" />
</Grid>
。
无论如何,我不清楚为什么你希望局部变量指定一个指针而不是一个结构。你可能确实想要这样做有可能的原因,但任何适用的都不明确。
答案 1 :(得分:0)
由于问题的标题似乎比特伦斯希尔所引用的更明确,所以在这里得到答案可能会很有趣。
您必须使用“复合文字”,它在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};
}