/ / Pourquoi segmentaion faute dans le programme C? - c, struct, segmentation-fault

Pourquoi segmentaion faute dans le programme C? - c, struct, segmentation-fault

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

struct keyVal
{
int key;
int val;
};

int main()
{

struct keyVal *arr[5];
int i;
for(i=0;i<5;i++)
printf("n : %p     %p      ",&arr[i][0].val,&arr[i]);
printf("nn");
printf("n : %d     %d      ",arr[0][0].val,arr[0]->val);
printf("nn");

for(i=0;i<5;i++)
printf("n : %d     %d      ",arr[i][0].val,arr[i]->val);
printf("nn");

return 0;
}

Premier, for( ; ; ); générera même %p %p de arr[0][0] à arr[4][0] et arr[0] à arr[4], ce qui signifie arr[i][0] == arr[i]i = 0,1,2,3,4.

Seconde for( ; ; ); devrait afficher les valeurs (valeur de mémoire) de arr[i][0].key (arr[i]->key).

Nous pouvons accéder à la clé en faisant:

arr[i][0].key OU arr[i]->keyi = 0,1,2,3,4.

Réponses:

0 pour la réponse № 1

Vous avez pris 5 variables de pointeur pointant vers la structure keyVal pour laquelle la mémoire n'est pas allouée, raison pour laquelle elle a rencontré un défaut de segmentation. Utilisation malloc pour allouer de la mémoire et ensuite utiliser.


0 pour la réponse № 2

Vous pouvez utiliser & arr [i] .val plutôt que & arr [i] [0] .val.


0 pour la réponse № 3

Voir les commentaires pour l'explication.
J'ai quitté le dernier for {...} à dessein je "espère que vous pourrez corriger vous-même

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

struct keyVal {
int key;
int val;
};

int main()
{
/*
You are creating an array composed of 5 cells.
Each cell is bound to contain an address of a variable
of which should be a keyVal.
*/
struct keyVal *arr[5];
int i;

/*
Use curly brackets to wrap the content of the loop
even though you only have one instruction it helps for readability
and prevents errors.
*/
for(i = 0; i < 5; i++) {
printf(": %p | %pn", &arr[i][0].val, &arr[i]);
}

/*
You are getting a segmentation fault here because you are trying to access something which does not exist.
*/
//printf(": %d - %dn", arr[0][0].val, arr[0]->val);

/***************************************************
BEGIN CORRECTION :the field val will be initialized.
***************************************************/

arr[0] = malloc(sizeof(struct keyVal)); // Allocating "sizeof(struct keyVal)" bytes in memory.
arr[0]->val = 42; // Assigning a value to the field val in the first cell of arr.
printf(": %d | %dn", arr[0][0].val, arr[0]->val); // Now we can print as a value now exists.

/***************************************************
END CORRECTION
***************************************************/
/*
Again use brackets ;p
I think you can solve that one on your own, now.
*/
for(i = 0; i < 5; i++) {
printf(": %d | %d n", arr[i][0].val, arr[i]->val);
}
// Don"t forget to free "ALL" the memory allocated with malloc.
free(arr[0]);

return 0;
}

En savoir plus sur malloc et gratuit.