2013-09-02 6 views
0

C'est un cas réel du puzzle.A propos de pointeurs, tableau et malloc

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

    #define ROWS 10 
    #define COLS 8 

    void process_array(int array[ROWS][COLS]) { 
      int i,j, count =0; 
      for (i=0; i< ROWS ;i++) 
        for(j=0 ; j<COLS; j++) 
         array[i][j]= count++; 



    } 

    int main() { 
    int **array = malloc(sizeof(int)*ROWS*COLS); 
    process_array(array); 

    /** int i,j; 
     for (i=0; i< ROWS ;i++){ 
        for(j=0 ; j<COLS; j++) 
         printf("%d ",array[i][j]); 
        printf("\n"); 
     } 
    **/ 

     return 0; 

    } 

Questions. (A) Bob veut savoir si le code d'Alice est correct. Il déconnecte le code de la ligne 21 à la ligne 26 pour sortir le contenu du tableau. Quel résultat obtiendra-t-il? (B) Alice insiste sur le fait que son code est absolument correct (ce qui est vrai). Comment peut- résoudre le problème si Bob a besoin d'accéder à la matrice dans la fonction principale via les opérateurs d'indice (c'est-à-dire, array[i][j])?

(c) Alice change sa signature de fonction

void process_array (int ** array) ; 

Quelle est/sont la modification correspondante (s) doit rendre Bob à la fonction principale? (D) Un autre étudiant Charlie conseille à Bob et Alice d'utiliser un tableau unidimensionnel pour simuler un tableau à deux dimensions. Bob modifie ensuite la ligne 18 du code ci-dessus en .

int * array=malloc (sizeof (int) *ROWS *COLS) ; 

Quelles sont les autres modifications à apporter au reste du code? Supposons qu'Alice veuille revenir à son implémentation d'origine.

S'il vous plaît me donner un coup de main.Merci beaucoup.

+3

Ça sent comme les devoirs – Paddyd

+0

Ce sont mes professeurs C puzzle et moi veulent penser plus profondément dans pointeur –

+1

C'est pourquoi vous devriez essayer d'abord les questions, puis demander de l'aide. Vous n'apprendrez pas beaucoup en demandant les réponses! – Paddyd

Répondre

1

Vous avez un cas typique de non-concordance de type. int ** array; n'est pas la même que int array[5][6];. Le premier vous donne un int* lors du déréférencement, le second un tableau de 6 s.

(a) Bob obtiendrait une SIGSEGV assez rapidement parce qu'il a défini un int **, mais la fonction d'Alice attend un int (*)[COLS] et c'est ce que la mémoire allouée pour Bob réellement.

(b) Bob devrait définir array comme

int (*array)[COLS] = malloc(sizeof(int)*ROWS*COLS); 

ou tout simplement pour la renvoyer sur la pile

int array[ROWS][COLS]; 

(c) allouer de la mémoire pour chaque ligne. D) Utiliser le type approprié, voir ci-dessus.

+0

Comment colorier le code ??? –

+0

@Clearner Que voulez-vous dire? sur stackoverflow il est coloré automatiquement. –