#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]
où 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]->key
où i = 0,1,2,3,4
.
Réponses:
0 pour la réponse № 1Vous 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.