Initialisation d’un tableau de pointeur entier en C

J’ai quelques confusions / problèmes sur l’utilisation des pointeurs en C. J’ai mis l’exemple de code ci-dessous pour le comprendre facilement. Veuillez noter les différences entre ces codes. Si vous avez un problème pour le comprendre, merci de nous faire part de vos commentaires.

Ça ne marche pas.

#include  #include  void process() { int *arr; arr=(int*)malloc(5*sizeof(int)); arr=(int*){3,1,4,5,2}; for(int z=0;z<5;z++) { printf("%d ",arr[z]); } printf("\n"); } int main() { process(); return 0; } 

Mais ça marche.

 #include  #include  void process() { int *arr; arr=(int*)malloc(5*sizeof(int)); arr=(int[]){3,1,4,5,2}; for(int z=0;z<5;z++) { printf("%d ",arr[z]); } printf("\n"); } int main() { process(); return 0; } 

Cela fonctionne aussi aussi. Pourquoi? Je n’ai pas alloué de mémoire ici.

 #include  #include  void process() { int *arr; arr=(int[]){3,1,4,5,2}; for(int z=0;z<5;z++) { printf("%d ",arr[z]); } printf("\n"); } int main() { process(); return 0; } 

Pourquoi ne sont-ils pas pareils?

  arr=(int*){3,1,4,5,2}; arr=(int[]){3,1,4,5,2}; 

Existe-t-il un autre moyen d’initialiser un tableau de pointeur entier sans l’utiliser de cette manière individuelle?

 arr[0]=3; arr[1]=1; arr[2]=4; arr[3]=5; arr[4]=2; 

Comment puis-je obtenir la taille / nombre d’allocation en mémoire de pointeur afin que je puisse utiliser quelque chose comme for(int z=0;z<NUM;z++) { au lieu de for(int z=0;z<5;z++) { statiquement?

Toute réponse est très appréciée.

Merci d’avance.

Lorsque vous dites: ptr = {1,2,3,4,5} , vous faites pointer un point vers une mémoire du segment de données, où le tableau constant {1,2,3,4,5} réside et que vous fuyez. Mémoire. Si vous souhaitez initialiser votre mémoire, juste après l’allocation, écrivez: ptr[0]=1; ptr[1]=2; ptr[0]=1; ptr[1]=2; etc. Si vous souhaitez copier des données, utilisez memcpy .

Les appels malloc dans les premiers exemples allouent un bloc de mémoire et affectent un pointeur à cette mémoire à arr . Dès que vous assignez à nouveau arr , la valeur du pointeur est écrasée et vous avez perdu la trace de la mémoire allouée, c’est-à-dire que vous l’avez perdue. C’est un bug juste là.

En d’autres termes, si vous allouez un bloc de mémoire à l’aide de malloc() , vous pouvez y écrire des données à l’aide de la syntaxe de tableau (par exemple):

 int* arr = (int *) malloc(sizeof(int) * 5); for (int i=0; i<5; ++i) arr[i] = i; 

Mais vous ne pouvez rien affecter directement à arr ou vous perdez le pointeur sur ce bloc de mémoire. Et lorsque vous allouez un bloc en utilisant malloc() , n'oubliez pas de le supprimer en utilisant free() lorsque vous n'en avez plus besoin.

Un tableau n'est pas un pointeur sur un entier; c'est un tableau. Un nom de tableau est dit "se désintègre en un pointeur" lorsque vous le transmettez en tant qu'argument à une fonction acceptant un pointeur en tant qu'argument, mais ce n'est pas la même chose.

En ce qui concerne votre dernière question: c’est la différence entre un tableau et un pointeur sur type: le compilateur connaît la taille d’un tableau, mais pas la taille d’un bloc pointé par un pointeur sur type. Malheureusement, la réponse est non.

Mais puisque vous écrivez en C ++, pas en C, vous ne devriez pas utiliser les tableaux de toute façon: utilisez `std :: vector '! Ils connaissent leur propre longueur, plus ils sont extensibles.

La liste de valeurs séparées par des virgules est une construction permettant d’initialiser des tableaux. Il ne convient pas pour initialiser les pointeurs sur les tableaux. C’est pourquoi vous avez besoin de cela (int[]) – il indique à gcc de créer un tableau d’entiers non nommé initialisé avec les valeurs fournies.

gcc ne vous laissera pas perdre les informations selon lesquelles arr est un tableau, sauf si vous le souhaitez vraiment. C’est pourquoi vous avez besoin d’un casting. Il vaut mieux que vous déclariez arr tant que tableau, pas en tant que pointeur. Vous pouvez toujours le transmettre aux fonctions qui acceptent un pointeur. Pourtant, gcc ne vous laisserait pas perdre de la mémoire avec malloc:

 error: incompatible types when assigning to type 'int[5]' from type 'void *' 

Si vous voulez une variable pouvant être un tableau ou un pointeur sur la mémoire allouée, créez une autre variable pour cela. Mieux encore, créez une fonction qui accepte un pointeur et transmettez-la à un tableau ou à un pointeur.