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)
我错过了什么或输入错误?
你在主函数中取消引用一个坏指针.要获取变量的地址,请使用地址&运算符,而不是解除引用*运算符.将主要重写为:
barrier_create(&test_barrier_p);
Run Code Online (Sandbox Code Playgroud)
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错误中恢复,否则我认为保留旧值没什么意义.
伯爵的目的是什么?
| 归档时间: |
|
| 查看次数: |
2149 次 |
| 最近记录: |