C Malloc для указателя через вызов функции вызывает ошибку шины - PullRequest
0 голосов
/ 16 апреля 2009

Из-за моего слабого понимания выделения памяти типов указателям следующее вызывает ошибку шины при вызове барьер_креату («привет» никогда не печатается).

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 ]

7 голосов
/ 16 апреля 2009

Вы разыменовываете неверный указатель в своей основной функции. Чтобы получить адрес переменной, вы используете оператор адреса &, а не оператор разыменования *. Переписать главное как:

barrier_create(&test_barrier_p);
7 голосов
/ 16 апреля 2009
barrier_create(*test_barrier_p);

Поскольку barrier_create принимает адрес barrier_p, это должно быть &test_barrier_p, а не *test_barrier_p.

printf("hi\n");

Неточный тест на достижимость кода, поскольку stdout, скорее всего, буферизован; Я бы порекомендовал fprintf(stderr, "hi\n"); вместо.

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

Я бы сказал sizeof(barrier_t). Снова * в нечетном месте, запись _p, возможно, не помогает ясности манипуляции с типом.

Для педантизма я бы проверил возвращаемое значение malloc. Я не вижу смысла в сохранении старого значения, если только каким-то образом не исправить ошибку malloc.

Какова цель подсчета?

0 голосов
/ 16 апреля 2009

Функция int barrier_create(barrier_p *barrier_pointer) принимает указатель в качестве аргумента. Тем не менее, вы переходите в actual barrier_p в своей основной, так как вы разыменовываете его - barrier_create(*test_barrier_p). Я думаю, что вы должны передавать адрес как barrier_create(&test_barrier_p)

0 голосов
/ 16 апреля 2009

Переменная test_barrier_p является указателем на структуру barrier, которая никогда не инициализируется, поэтому она имеет значение NULL (так как находится в области видимости файла).

Вы отменяете ссылку на него при вызове с main() до barrier_create().

Чтобы получить дополнительную помощь, вам нужно сообщить нам на английском языке, чего вы пытаетесь достичь.

...