0

由于我对将类型内存分配给指针的理解薄弱,以下导致调用 barrier_create 时出现总线错误(从未打印过“hi”)。

typedef struct barrier barrier_t;
typedef struct barrier *barrier_p;

barrier_p test_barrier_p;

int main(int argc, char *argv[]) {
    barrier_create(*test_barrier_p);
}

int barrier_create(barrier_p *barrier_pointer) {
printf("hi\n");
    barrier_p old_barrier, new_barrier;
    int count;
    old_barrier = (barrier_p) *barrier_pointer;
    new_barrier = (barrier_p) malloc(sizeof(*new_barrier));
    count = pthread_mutex_init(&new_barrier->lock, NULL);
    new_barrier->is_valid = VALID_BARRIER;
    new_barrier->counter = 0;
    new_barrier->release_flag = 0;
    *barrier_pointer = new_barrier;
    return HAPPY_HAPPY_JOY_JOY;
}

我错过了什么或输入错误?

4

4 回答 4

7

您正在取消引用 main 函数中的错误指针。要获取变量的地址,请使用地址&运算符,而不是取消引用*运算符。将 main 重写为:

barrier_create(&test_barrier_p);
于 2009-04-16T06:32:30.043 回答
7
barrier_create(*test_barrier_p);

由于barrier_create需要 a 的地址barrier_p,这应该是&test_barrier_p,而不是*test_barrier_p

printf("hi\n");

代码可达性测试不准确,因为标准输出可能被缓冲;我建议fprintf(stderr, "hi\n");改为。

new_barrier = (barrier_p) malloc(sizeof(*new_barrier));

我会说sizeof(barrier_t)。同样*在一个奇怪的地方,该_p符号可能无法帮助您的类型操作清晰。

对于迂腐,我会检查 malloc 的返回值。我认为保留旧值没有什么意义,除非以某种方式从 malloc 错误中恢复。

计数的目的是什么?

于 2009-04-16T06:36:50.690 回答
0

test_barrier_p变量是一个指向barrier从未被初始化的结构的指针,因此它被设置为 NULL(因为它在文件范围内)。

您在调用 from main()to时取消引用它barrier_create()

如需其他帮助,您需要用英语告诉我们您想要实现的目标。

于 2009-04-16T06:30:25.790 回答
0

该函数int barrier_create(barrier_p *barrier_pointer)将指针作为参数。actual barrier_p但是,由于您取消引用它,因此您在 main 中传递了- barrier_create(*test_barrier_p)。我认为你应该像这样传递地址barrier_create(&test_barrier_p)

于 2009-04-16T08:44:14.470 回答