2017-05-29 1 views
0

J'ai créé un petit morceau de code pour allouer dynamiquement un tableau 2D en C, cela est utilisé pour essayer de résoudre un problème que j'ai un plus grand morceau de code, si je peux obtenir ma tête autour de l'allocation dynamique d'un tableau 2D Je suis confiant que je vais résoudre mon autre problème. Le problème que j'ai eu est qu'après avoir alloué la matrice et écrit avec une fonction mon programme ne fonctionne pas, je ne reçois aucune erreur, il crée juste un écran vide et finit par se bloquer. Je ne suis pas sûr de savoir où progresser, toute aide serait grandement appréciée!erreur avec un tableau 2D alloué dynamiquement

Voici le code:

#include <stdlib.h> 

void get_matrix(double **a, int n); 

int main() { 
    int n = 5; 
    int i, j; 
    double **a; 

    a = (double **)malloc(n * sizeof(double *)); 
    for (j = 0; j < n; j++) 
     a[j] = (double *)malloc(n * sizeof(double)); 

    get_matrix(a, n); 

    for (i = 0; i <= n; i++) { 
     for (j = 0; j <= n; j++) { 
      printf("%d, ", a[i][j]); 
     } 
     printf("\n, "); 
    } 
    return 0; 
} 

void get_matrix(double **a, int n) { 
    int i, j; 

    for (i = 0; i <= n; i++) { 
     for (j = 0; j <= n; j++) { 
      a[i][j] = 4; 
     } 
    } 
} 
+0

Avez-vous lu [this] (https://stackoverflow.com/q/42094465/694733)? – user694733

+0

@DavidBowling: à proprement parler, vous avez raison. Pourquoi ne pas poster une réponse avec le code c99 qui alloue et utilise un VLA 2D? La syntaxe est un peu plus compliquée que le code de tableau indirect 2D affiché ci-dessus. – chqrlie

+0

@DavidBowling: Il y avait d'autres problèmes, j'ai posté une réponse plus complète. – chqrlie

Répondre

2

Il y a plusieurs problèmes dans votre code:

  • Vous n'incluez pas <stdio.h>
  • Votre index de boucle i et j course un pas trop loin: puisque l'indexation est zéro basée en C, vous doit s'arrêter avant n ou vous essayerez d'accéder aux éléments à l'extérieur du tableau. Ce bug provoque un comportement indéfini, une explication plausible pour ce que vous observez.
  • Vous passez un double pour la spécification de conversion %dprintf. Utilisez %g à la place.
  • Vous imprimez des virgules supplémentaires au début des lignes.
  • Votre tableau n'est pas vraiment un tableau 2D, c'est un tableau indirect. Dans C99, vous pouvez allouer et utiliser des tableaux dynamiques avec des tailles paramétriques, appelées VLA.Regardez la syntaxe ci-dessous:

Voici une version améliorée:

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

static void get_matrix(int n, double a[n][n]) { 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < n; j++) { 
      a[i][j] = 4; 
     } 
    } 
} 

int main(void) { 
    int n = 5; 
    double (*a)[n] = malloc(sizeof(*a) * n); 

    get_matrix(n, a); 

    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < n; j++) { 
      printf("%g, ", a[i][j]); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 
+0

Tu m'as battu dessus! Pour simplifier, j'aime utiliser 'malloc (sizeof * a * n)', en plaçant d'abord l'expression 'sizeof' par habitude. Cela réduit le risque de débordement lorsque vous avez plus d'une multiplication: 'malloc (sizeof * a * x * y)'. Et j'utiliserais 'size_t' pour' n' et les indices du tableau. –

+1

@DavidBowling: Bon point, je fais habituellement la même chose pour exactement la même raison, mais je préfère 'sizeof (* a) * n' pour plus de clarté. J'ai été attrapé une fois par 'malloc (x * y * sizeof (* p))' avec des entiers 'x' et' y' plus petits que 'size_t', le débordement n'est pas facile à repérer même en regardant le code. Avec une seule multiplication, ce n'est pas un problème, mais la cohérence est une règle d'or. – chqrlie

+0

Salut à tous! Je n'ai pas pu travailler sur ce problème depuis que vous m'avez aidé la semaine dernière! J'ai fait quelques changements à la façon dont il a été écrit et ça fonctionne bien, le seul problème étant que lorsque j'imprime la matrice, il imprime seulement des zéros? –

2

problème est en boucle. Votre boucle for fonctionne maintenant n + 1 fois au lieu de n fois. Cela signifie que vous essayez d'écrire quelque part sur une zone de mémoire non allouée.

for (i=0; i<=n; i++)

devrait être:

for (i=0; i<n; i++)

Vous devez utiliser des conditions est moins au lieu de est inférieure ou égale.


Alors que je peux voir votre code, je vous suggère également quelques trucs pour éviter des problèmes plus tard en utilisant des variables dans sizeof directement:

a = (double **) malloc (n * sizeof(*a)); 

Ce détectera automatiquement sizeof de *a qui est nécessaire pour l'allocation Taille.

+0

Voilà c'est trié merci! Vous avez résolu un mal de tête! :) –

+0

Content d'entendre;) Si cela fonctionne pour vous, vous pouvez cliquer sur "Corriger la réponse" pour le confirmer. – tilz0R

1

Vos index sont basés sur zéro. Cela signifie que vous vérifiez la condition de fin d'une boucle forcée avec un < et non un < =. 0..n-1 sont les n emplacements que vous avez alloués.

#include <stdlib.h> 

void get_matrix (double **a, int n); 

int main() 

{ 
    int n = 5; 
    int i, j; 
    double **a; 



    a = (double **) malloc (n * sizeof(double *)); 
    for (j = 0; j < n; j++) 
     a[j] = (double *) malloc (n * sizeof(double)); 

    get_matrix (a, n); 

    for (i=0; i<n; i++) 
    { 
     for (j=0; j<n; j++) 
     { 
      printf("%d, ", a[i][j]); 
     } 
     printf("\n, "); 
    } 

    return 0; 

} 

void get_matrix (double **a, int n) 
{ 
    int i, j; 

    for (i=0; i<n; i++) 
    { 
     for (j=0; j<n; j++) 
     { 
      a[i][j] = 4; 
     } 
    } 
} 
+0

C'est super merci! –

+0

Ce code a un comportement indéfini puisque 'a [i] [j]' est un 'double', étant imprimé avec un spécificateur de conversion'% d'. –

0

Je n'ai pas été en mesure de travailler sur ce problème depuis la dernière m'a dépanné la semaine dernière! J'ai fait quelques changements à la façon dont il a été écrit et ça fonctionne bien, le seul problème étant que lorsque j'imprime la matrice, il imprime seulement des zéros?

J'ai inclus le code révisé ci-dessous.

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

void get_matrix (double **a, int n); 
void print_matrix (double **a, int n); 

int main() 

{ 
    int n = 5; 
    int i, j; 
    double **a; 



    a = (double **) malloc (n * sizeof(double *)); 
    for (j = 0; j < n; j++) 
     a[j] = (double *) malloc (n * sizeof(*a)); 

    get_matrix (a, n); 
    print_matrix (a, n); 


    return 0; 

} 

void get_matrix (double **a, int n) 
{ 
    int i, j; 

    for (i=0; i<n; i++) 
    { 
     for (j=0; j<n; j++) 
     { 
      a[i][j] = 4; 
     } 
    } 
} 

void print_matrix (double **a, int n) 
{ 
    int i, j; 

    for (i=0; i<n; i++) 
    { 
     for (j=0; j<n; j++) 
     { 
      printf("%d, ", a[i][j]); 
     } 
     printf("\n "); 
    } 
}