gpt4 book ai didi

c - 我的未分配指针将指向这里什么?

转载 作者:行者123 更新时间:2023-11-30 16:36:57 25 4
gpt4 key购买 nike

我已将我的邮箱简化为以下代码。我有 SetMsg()、GetMsg() 和 ClearMsg() 函数。在 SetMsg() 中,我的目的是存储消息直到调用 GetMsg() 为止,此时存储的消息将返回给调用者,并且我的目的是将先前存储的消息转换为 NULL。

但是由于我没有malloc-ing任何东西,我想知道像下面那样将消息存储在ptr_Msg中是否完全安全?由于在将 msg“保存”到 ptr_Msg 后,我无法控制存储 msg 的内存会发生什么,所以内存是否有可能msg 后来由其他一些变量分配,而我仍然指向该地址?或者我的 staticptr_Msg 声明中?拯救世界?

例如,msg 在发送到 SetMsg() 时携带成员 signal,我将其存储在 ptr_Msg。然后,在此函数的范围之外,msg 更改其signal 的值。如果我随后收到 GetMsg(),我会返回 signal 的新值还是它到达 SetMsg() 时的值?

我应该做这样的事情吗?在SetMsg()

Msg* tmp = (Msg*) msg;
ptr_Msg = (Msg*) malloc(sizeof *tmp);
memcpy(ptr_Msg, tmp, sizeof *tmp);

然后在ClearMsg()

free(ptr_Msg);
ptr_Msg = NULL;

当前代码:

typedef struct Msg {
uint16_t signal;
} Msg_t;

static Msg_t* ptr_Msg = NULL;


bool GetMsg(char** msgData, uint16_t* sigNo) {
*msgData = (char*) ptr_Msg;

// Get message
if (*msgData != NULL) {
// do some stuff

// and then
ClearMsg();
return true;
}

return false;
}

bool SetMsg(void* msg) {

if (ptr_Msg!=NULL) {
return false;
}

ptr_Msg = (Msg*) msg;

return true;
}

void ClearMsg() {
ptr_Msg = (Msg*) NULL;
}

编辑和可能的答案:我设法对此进行了测试,当然,它是站不住脚的。我已将代码更改为以下内容,它似乎有效。我用“<===新代码部分===>”标记了部分。

malloc和free的使用是否正确/安全?

typedef struct Msg {
uint16_t signal;
} Msg_t;

static Msg_t* ptr_Msg = NULL;


bool GetMsg(char** msgData, uint16_t* sigNo) {
*msgData = (char*) ptr_Msg;

// Get message
if (*msgData != NULL) {
// do some stuff

// and then
ClearMsg();
return true;
}

return false;
}

bool SetMsg(void* msg) {

if (ptr_Msg!=NULL) {
return false;
}
// <=== new code section ===>
ptr_Msg = malloc(sizeof *ptr_Msg);
memcpy(ptr_Msg, (Msg_t*) msg, sizeof *ptr_Msg);
// <=== ===>
return true;
}

void ClearMsg() {
// <=== new code section ===>
free(ptr_Msg);
// <=== ===>
ptr_Msg = (Msg*) NULL;
}

最佳答案

您的代码是单个文件范围变量 ptr_Msg 的复杂包装。这些函数定义了一个接口(interface)。该接口(interface)与调用者签订了关于指针ptr_Msg引用的数据的所有权的契约。只要合约未知,就不可能判断是否需要复制数据而不是存储指针。在当前的实现中,调用者负责确保数据的生命周期至少持续指针引用数据的时间。如果需要一个容器(或邮箱)负责存储一些数据,则需要用类似的memcpy来复制数据。

主要问题是,你想要什么?契约(Contract)是什么?存储了什么?

关于c - 我的未分配指针将指向这里什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48225657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com