gpt4 book ai didi

c - 为什么指针传递给函数时会被设置为 (nil)?

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

我在尝试让线程处理程序模拟器在 C 中工作时遇到段错误。我定义了以下结构:

typedef struct queue_t {
struct green_t *front, *rear;
} queue_t;

typedef struct green_cond_t {
struct queue_t *queue;
} green_cond_t;

在 green.o 中,我有用于绿色条件的函数(最重要的是展示我如何初始化 green_cond_t 结构):

void green_cond_init(green_cond_t *cond) {
cond = (green_cond_t *) malloc(sizeof(green_cond_t));
cond->queue = (queue_t *) malloc(sizeof(queue_t));
cond->queue->front = cond->queue->rear = NULL;
}

void green_cond_wait(green_cond_t *cond) {
green_t *susp = running;
enqueue(cond->queue, susp);
running = dequeue(ready);
swapcontext(susp->context, running->context);
}

void green_cond_signal(green_cond_t *cond) {
//check pointer reference
printf("queue pointer in green_cond_signal: %p\n", cond->queue);
if (dequeue(cond->queue) == NULL) return; //assuming segfault happens here...
green_t *init = dequeue(cond->queue);
enqueue(ready, init);
}

在测试.c中:

int flag = 0;
green_cond_t cond;

void * test(void *arg) {
int id = *(int *) arg;
int loop = 4;
while (loop > 0) {
if (flag == id) {
printf("thread %d: %d\n", id, loop);
loop--;
flag = (id + 1) % 2;
//check pointer reference
printf("queue pointer in test: %p\n", &cond.queue);
green_cond_signal(&cond);
} else {
green_cond_wait(&cond);
}
}
}

int main() {
green_cond_init(&cond);

green_t g0, g1;
int a0 = 0;
int a1 = 1;

green_create(&g0, test, &a0);
green_create(&g1, test, &a1);

green_join(&g0, NULL);
green_join(&g1, NULL);
printf("done\n");
return 0;
}

运行 test.c 的输出:

thread 0: 4
queue pointer in test: 0x5620b9f8c450
queue pointer in green_cond_signal: (nil)
Segmentation fault (core dumped)
Program received signal SIGSEGV, Segmentation fault.
0x000055555555499f in dequeue ()
(gdb) back
#0 0x000055555555499f in dequeue ()
#1 0x0000555555554d5c in green_cond_signal ()
#2 0x0000555555554e22 in test ()
#3 0x0000555555554b04 in green_thread ()
#4 0x00007ffff7a3c6b0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#5 0x0000000000000000 in ?? ()

由于某种原因,第一次调用green_cond_signal()cond.queue指针被设置为nil,我只是不明白为什么。我做错了什么?

最佳答案

您将green_cond_t的地址传递给green_cond_init,但随后您覆盖了传入的指针的值:

cond = (green_cond_t *) malloc(sizeof(green_cond_t));

这意味着您正在初始化一个动态分配的结构,而不是全局结构。因此,当函数返回时,全局 cond 仍然包含来自其隐式初始化的 NULL 指针。

green_cond_init 中删除上述 malloc 调用,全局 cond 将被正确初始化。

关于c - 为什么指针传递给函数时会被设置为 (nil)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182632/

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