gpt4 book ai didi

c - 段错误更新 c 中的 int 指针

转载 作者:太空宇宙 更新时间:2023-11-04 08:13:29 26 4
gpt4 key购买 nike

我在使用一个测试程序时遇到了一些问题。如果我尝试取消引用指针以更新其值,则会导致段错误。

这是被调用的函数:

// Extracts a message from the community mailbox
void mbox_withdraw(struct mbox *mb, char *msg, int *len)
{
// Locks the semaphore
sem_wait(lock);

// If message node is null, there is no message, just return
if (mb->msg != NULL)
{
int var = strlen((mb->msg)->message);
len = &var;
strncpy(msg, (mb->msg)->message, len + 1);


// If there is only one message node
if ((mb->msg)->next == NULL)
{
(mb->msg)->message = NULL;
free((mb->msg)->message);
mb->msg = NULL;
free(mb->msg);
}

// There are more than one message, just take the first one
else
{
struct messageNode *temp = mb->msg;
mb->msg = (mb->msg)->next;
temp->message = NULL;
free(temp->message);
temp->next = NULL;
free(temp);
}
}
// Unlocks the semaphore
sem_signal(lock);
}

这是调用函数:

int main(void) {

t_init();

mbox_create(&mb);
t_create(producer, 1, 1);
t_create(producer, 2, 1);
t_create(consumer, 3, 1);
t_yield();

int len;
char mesg[1024];
mbox_withdraw(mb, mesg, &len); // should print a warning about the mailbox not having any messages

mbox_destroy(&mb);

t_shutdown();
printf("Done with mailbox test...\n");
fflush(stdout);

return 0;
}

如果我使用:

int var = strlen((mb->msg)->message);
len = &var;

没有段错误,但当然这不是更新值的正确方法。如果我使用:

int var = strlen((mb->msg)->message);
*len = var;

这是我在这个网站上的第一篇文章,如果这篇文章看起来很尴尬,请原谅。

最佳答案

在函数中,len是一个指针。你在这里做什么:

int var = strlen((mb->msg)->message);
len = &var;
strncpy(msg, (mb->msg)->message, len + 1);

将 var 的地址分配给 len 指针(例如,它可以是 0x12345678),然后使用指针(包含 0x12345678)作为值(尝试从 (mb->msg) 复制 0x12345678+1 数据)->message to msg), 导致段错误。

第二种方式是对的,将var值赋给len指针值(不是地址),但是接下来你必须做:

strncpy(msg, (mb->msg)->message, *len + 1);

获取指针的值。

关于c - 段错误更新 c 中的 int 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37334901/

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