Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Puntatore a puntatore in C

    Ho un problema con i puntatori in C: se li uso per accedere ad array a 2 o più dimensioni il compilatore non dà problemi, ma il programma si interrompe durante l'esecuzione (in Linux mi da' "segmentation fault", in win 98 "il programma ha eseguito un'operazione non valida...", in win2003 si blocca).
    Qualcuno potrebbe mandarmi il codice funzionante (non solo compilato senza errori)?
    Ciao

    #include <stdlib.h>
    #include <malloc.h>
    #include <stdio.h>

    int main() {
    int **vet;
    vet=(int **)malloc(sizeof(int)*5*2);
    for (int i=0; i<5; i++) {
    for (int j=0; j<2; j++) {
    vet[i][j]=i+j;
    printf("%i", vet[i][j]);
    printf("\n");
    }
    }
    free(vet);
    return(0);
    }

  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Me perchè in quel codice hai usato un puntatore a puntatore?
    Non ce n'era bisogno!

  3. #3
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772

    Re: Puntatore a puntatore in C

    Allochi in maniera errata la memoria

    **vet è un puntatore puntatori, quindi i suoi elementi non sono int, ma puntatori a int.
    Inoltre ogni elemento di **vet è a sua volta un puntatore ad interi quindi deve essere mallocato

    Questo è un modo corretto per allocare un vettore di vettori m x n


    int **vet, i, j;


    vet = (int **)malloc(m*sizeof(int *))

    for(i = 0; i < m; i++)
    *(vet+i) = (int *) malloc(n*sizeof(int));
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  4. #4
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    p.s. all'interno del ciclo for potresti metterne un secondo per inizializzare tutti gli elementi, una cosa del tipo:

    for(j = 0; j < n; j++)
    *((*(vet+i))+j) = 10;


    p.p.s. *((*(vet+i))+j) = vet[i][j], se ti abitui coi puntatori è meglio
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  5. #5
    Ok, funziona, ma ho ancora un dubbio: la memoria allocata va liberata di volta in volta all'interno dei cicli:

    free(*(vet+i));

    oppure basta farlo alla fine:

    free(vet);

    ?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.