我正在使用的测试程序遇到一些麻烦。如果我尝试取消引用指针以努力更新其值会导致段错误。
这是被调用的函数:
// 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;
这是我在这个网站上的第一篇文章,所以如果这篇文章看起来很尴尬,请原谅。
答案 0 :(得分:1)
未经过测试,但仅使用我的手机。我对strncpy呼叫的反应更多。如果使用带-Wall标志的gcc应该发出警告
len = &var;
strncpy(msg, (mb->msg)->message, len + 1);
向
*len = var;
strncpy(msg, (mb->msg)->message, *len + 1);
或者
*len = var;
strcpy(msg, (mb->msg)->message);
答案 1 :(得分:1)
在函数中,len是一个指针。你在这做什么:
int var = strlen((mb->msg)->message);
len = &var;
strncpy(msg, (mb->msg)->message, len + 1);
将var的地址分配给len指针(例如,它可以是0x12345678),然后使用指针(包含0x12345678)作为值(尝试从(mb->)复制0x12345678 + 1数据。 msg) - >消息到msg),导致段错误。
第二种方法是右边,将var值分配给len指针值(不是地址),但是你必须这样做:
strncpy(msg, (mb->msg)->message, *len + 1);
获取指针的值。
答案 2 :(得分:0)
我认为段错误不是由您指定的行生成的。如果您使用gcc
,最好使用gdb
进行调试,或使用valgrind
等内存模拟进行调试。然后你会看到哪一行是segfaulting。
如果len
未正确设置,则会产生后果。我想你删除了一些行但是使用了陈述的例子len
没有意义,因为它只使用了一次,在这里你可以写:
strncpy(msg, (mb->msg)->message, var + 1);