【发布时间】:2016-03-21 19:11:22
【问题描述】:
我在将 void 指针分配给另一个结构指针时遇到问题。 我的输入参数在函数 semaphoreCreateBinary 内部发生了更改,但是当它返回到 main 时,它又是空的。我可能必须做某种类型的演员,但我似乎无法让它发挥作用。
我将包含我认为理解我的问题所必需的代码:
来自我的头文件。
typedef struct semaphoreStruct
{
int smValue;
tcbExtS *smHolder;
int smCeiling;
}semaS;
typedef void * SemaphoreHandle;
在我的 C 文件中
unsigned int semaphoreCreateBinary(void *ro_Handle,unsigned int i_InitialValue)
{
semaS *Semaphorehandle1;
Semaphorehandle = malloc (sizeof(*Semaphorehandle));
Semaphorehandle1->smValue = i_InitialValue;
ro_Handle = Semaphorehandle1; //seems to get the correct value
return resultUnInt;
}
int main(void)
{
SemaphoreHandle s1vPtr;
semaphoreCreateBinary(&s1vPtr,0);
int IV = s1vPtr->smValue//s1vPtr is empty again here
}
有什么建议可以改正吗?
编辑: 即使我将参数作为地址传递: semaphoreCreateBinary(&s1vPtr,0); 这是行不通的。 我无法更改输入类型,因为我们从老师那里得到了它作为 API 规范,否则我会更改它。
【问题讨论】:
-
您传递一个 void* 指针,然后在函数中更改指针的值,但指针的值是副本,因此不会保存更改。您需要将地址传递给 void* 指针,然后更改将被保存。
-
semaS *Semaphorehandle1; Semaphorehandle1->smValue = i_InitialValue;可能会由于未初始化的指针变量而导致 segfault。而且,该函数尝试更改作为参数传递的变量的副本,但即便如此,它也会分配一个在函数返回时超出范围的值。 -
您的问题缺少对代码打算做什么的描述:应该
semaphoreCreateBinarymodify/initialize 一个作为指针传递给它的信号量struct,还是应该动态地分配和初始化一个新的信号量? -
它应该动态创建一个新的信号量,然后当函数运行完成时输入参数应该指向新的信号量,这样我就可以在 main 中使用它
-
如果您不能使用
**,则更改函数类型并返回指向已分配内存的指针:您不使用当前返回值。如果您需要返回失败状态,return NULL... 并且请不要更改问题以响应 cmets 和答案,当通读整个问题和对话时,这会使他们的意图变得毫无意义。
标签: c pointers struct pass-by-reference pass-by-value