C Malloc til en Pointer Gjennom Function Call Årsaker Buss Feil

stemmer
0

På grunn av min svak forståelse for tildeling av typen minne til pekere, fører følgende bussfeil på kallet til barrier_create ( hei er aldri trykt).

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

Hva er det jeg mangler eller mis-typing?

Publisert på 16/04/2009 klokken 06:27
kilden bruker
På andre språk...                            


4 svar

stemmer
7

barrier_create(*test_barrier_p);

Siden barrier_createtar adressen til en barrier_p, bør dette være &test_barrier_p, ikke *test_barrier_p.

printf("hi\n");

Unøyaktig test av kode reachability fordi stdout er sannsynlig bufret; Jeg vil anbefale fprintf(stderr, "hi\n");stedet.

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

Jeg vil si sizeof(barrier_t). Igjen en *i et merkelig sted, den _pnotasjon kanskje ikke hjelpe din type manipulasjon klarhet.

For pedanticism, ville jeg sjekke returverdien av malloc. Jeg ser liten vits i å holde den gamle verdien med mindre å gjenopprette på noen måte fra en malloc feil.

Hva er hensikten med tellingen?

Svarte 16/04/2009 kl. 06:36
kilden bruker

stemmer
7

Du dereferencing en dårlig peker i hovedfunksjon. For å få adressen til variabelen, bruker du adressen &operatør, ikke dereferencing *operatør. Rewrite hoved som:

barrier_create(&test_barrier_p);
Svarte 16/04/2009 kl. 06:32
kilden bruker

stemmer
0

Funksjonen int barrier_create(barrier_p *barrier_pointer)tar en peker som et argument. Men du en forbikjøring i en actual barrier_pi hoved siden du dereference det - barrier_create(*test_barrier_p). Jeg tror du bør være bestått adresse sombarrier_create(&test_barrier_p)

Svarte 16/04/2009 kl. 08:44
kilden bruker

stemmer
0

Den test_barrier_pvariable er en peker til en barrierstruktur som er aldri blir initialisert, slik at den er satt til NULL (siden det er ved fil omfang).

Du de-refererer det på telefon fra main()til barrier_create().

For hjelp utover det, må du fortelle oss, på engelsk, hva du prøver å oppnå.

Svarte 16/04/2009 kl. 06:30
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more