2009-04-16 484 views
0

由于我对分配指针的类型内存的理解不够,下面的调用barrier_create会导致总线错误(“hi”从不打印)。C malloc通过函数调用指针导致总线错误

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; 
} 

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

+2

作为一个小挑逗:你通常不会“分配指针”。您分配存储空间或内存,然后获得指向该内存的指针。 – unwind 2009-04-16 07:55:26

+0

谢谢放松。这是一个有用的排名,我转换了我的措辞以反映我的理解。 – Noel 2009-04-16 13:12:56

+1

这不是你的问题的答案,但一般来说你可能应该避免做像`typedef struct barrier * barrier_p`这样的东西。只需使用'barrier_t *`。从长远来看,它会减少混淆,'const barrier_t *`和`const barrier_p`不会是一回事。 – jamesdlin 2010-01-17 20:00:30

回答

7
barrier_create(*test_barrier_p); 

由于barrier_create需要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错误中恢复,否则我认为保持旧值的意义不大。

伯爵的目的是什么?

0

test_barrier_p变量是一个指向barrier结构的指针,它永远不会被初始化,所以它被设置为NULL(因为它在文件范围内)。

您正在从main()barrier_create()的电话中取消参考。

除此之外的帮助,您需要用英语告诉我们您要达到的目标。

7

您在您的主函数中取消了一个糟糕的指针。要获取变量的地址,请使用地址&运算符,而不要使用取消引用*运算符。重写主要为:

barrier_create(&test_barrier_p); 
0

函数int barrier_create(barrier_p *barrier_pointer)将指针作为参数。但是,由于您取消引用了barrier_create(*test_barrier_p),因此您在主文件中传入了actual barrier_p。我认为你应该通过地址barrier_create(&test_barrier_p)