通过函数调用C malloc到指针导致总线错误

Noe*_*oel 0 c malloc struct pointers bus-error

由于我对将指针类型内存分配给指针的过分理解,以下原因导致对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;
}
Run Code Online (Sandbox Code Playgroud)

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

Jas*_*oco 7

你在主函数中取消引用一个坏指针.要获取变量的地址,请使用地址&运算符,而不是解除引用*运算符.将主要重写为:

barrier_create(&test_barrier_p);
Run Code Online (Sandbox Code Playgroud)

  • 杰森是对的,你的间接倒退了. (2认同)

Kim*_*ece 7

barrier_create(*test_barrier_p);
Run Code Online (Sandbox Code Playgroud)

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

printf("hi\n");
Run Code Online (Sandbox Code Playgroud)

由于stdout可能被缓冲,因此代码可达性的测试不准确; 我建议fprintf(stderr, "hi\n");改为.

new_barrier = (barrier_p) malloc(sizeof(*new_barrier));
Run Code Online (Sandbox Code Playgroud)

我会说sizeof(barrier_t).再次*在一个奇怪的地方,_p符号可能无助于你的类型操作清晰度.

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

伯爵的目的是什么?