Initialisation du tableau de pointeur entier en C
J'ai quelques confusions/problèmes relatifs à l'utilisation des pointeurs en C. j'ai mis l'exemple de code ci-dessous pour le comprendre facilement. Veuillez remarquer des différences de ces codes. Si vous avez une certaine compréhension du problème, s'il vous plaît avoir un retour.
Cela ne fonctionne pas.
#include <stdio.h>
#include <stdlib.h>
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 cela fonctionne.
#include <stdio.h>
#include <stdlib.h>
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. Pourquoi? Je n'ai pas allouer de la mémoire ici.
#include <stdio.h>
#include <stdlib.h>
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 de même?
arr=(int*){3,1,4,5,2};
arr=(int[]){3,1,4,5,2};
Est-il un autre moyen pour l'initialisation de tableau de pointeur entier, ne l'utilisez pas cet individu affectation?
arr[0]=3;
arr[1]=1;
arr[2]=4;
arr[3]=5;
arr[4]=2;
Comment puis-je obtenir la taille/numéro de l'allocation de la mémoire du pointeur de façon à ce que je peux 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é.
Merci d'avance.
arr=(int[]){3,1,4,5,2};
Je pense n'est pas valide en C++.Oui, je suis en utilisant le compilateur gcc. Il n'est pas valide en C++?
arr=(int[]){3,1,4,5,2};
Oui, ils sont appelés composé de littéraux et gcc accepte en C++ comme une extension (essayez de compiler avec
-pedantic
et vous devriez obtenir un message d'avertissement).Vous avez stdlib.h il ET iostream. Aussi l'espace de noms ET le malloc. Quelle langue est-ce ? C+ ?
J'ai enlevé iostream et l'espace de noms. C'est C. Merci.
OriginalL'auteur shibly | 2012-05-16
Vous devez vous connecter pour publier un commentaire.
Quand vous dites:
ptr = {1,2,3,4,5}
, vous faitesptr
point à un mémoire dans le segment de données, où la constante de tableau{1,2,3,4,5}
réside et donc vous êtes une fuite de mémoire. Si vous souhaitez initialiser votre mémoire, juste après attribution, écrire:ptr[0]=1; ptr[1]=2;
et ainsi de suite. Si vous souhaitez copier des données, l'utilisation memcpy.Comment voulez-vous remplir la mémoire allouée? Peut-être vous voulez juste pour lire des données à partir de votre constante tableau? Ensuite, il suffit de dire: ptr = {1,2,3,4,5} sans alloc() ou[]. Mais vous n'obtiendrez pas une chance de modifier ce tableau.
Votre réponse est un peu déroutant. Qu'est-ce que ptr ici tableau ou un pointeur? Pouvez-vous s'il vous plaît poster complète du code C ptr?
Pointeur et tableau est le même en C. Si vous le voulez, vous pouvez skype moi (stiv.yakovenko), je vais essayer de l'expliquer à l'aide de diagramme dans mspaint.
Désolé de vous contredire, mais les tableaux et les pointeurs sont deux choses très différentes dans C. Juste à essayer si vous ne me croyez pas:
int a[3]; printf("sizeof(a) = %d\n", (int)sizeof(a)); printf("sizeof(a + 0) = %d\n", (int)sizeof(a + 0));
La premièreprintf()
imprime 12, le deuxième de 8. Pourquoi? Parce que dansa + 0
le tableau identificateur de tomber dans un pointeur, et c'est quelque chose de très différent de celui d'un tableau.OriginalL'auteur Stepan Yakovenko
La
malloc
appelle dans les premiers exemples allouer un bloc de mémoire et affecter un pointeur vers la mémoire àarr
. Dès que vous attribuez àarr
encore une fois, la valeur du pointeur est écrasé, et vous avez perdu la trace de cette mémoire allouée -- c'est à dire, vous avez une fuite. C'est un bug là.En d'autres termes, si vous allouer un bloc de mémoire à l'aide de l'aide de
malloc()
, alors vous pouvez écrire des données à l'aide de la syntaxe de tableau (par exemple):Mais vous ne pouvez pas affecter de toute autre chose directement à
arr
, ou vous perdez le pointeur à ce bloc de mémoire. Et quand vous allouer un bloc à l'aide demalloc()
, n'oubliez pas de le supprimer à l'aide defree()
lorsque vous en avez le plus besoin.Un tableau est pas un pointeur vers un entier; c'est un tableau. Un nom de tableau est dit "désintégration d'un pointeur" lorsque vous passez en argument à une fonction acceptant un pointeur comme un argument, mais ils ne sont pas la même chose.
Concernant votre dernière question: c'est en fait la différence entre un tableau et un pointeur de type: le compilateur connaît la taille d'un tableau, mais il ne sait pas la taille d'un bloc pointé par l'arbitraire d'un pointeur de type. La réponse, malheureusement, n'est pas.
Mais puisque vous avez écrit en C++, pas du C, vous ne devriez pas utiliser des tableaux de toute façon: utiliser `std::vector'! Ils savent que leur propre longueur, en plus d'être extensible.
La compréhension du TSL vecteur est trop difficile pour le débutant.
Friedman-Hill, je ne comprenais pas, le code est un bug que j'ai posté? Qui a le bug?
J'espère que vous vous moquez. Il est plus facile que de tomber un journal.
Les deux incluent
malloc
l'utiliser à tort, et si vous avez une fuite de mémoire, ce qui est un bug.OriginalL'auteur Ernest Friedman-Hill
La liste séparée par des virgules de valeurs est une construction pour l'initialisation de tableaux. Il n'est pas convenable pour l'initialisation des pointeurs vers des tableaux. C'est pourquoi vous avez besoin que
(int[])
- il dit gcc pour créer une nouvelle tableau d'entiers qui est initialisé avec les valeurs fournies.gcc ne vous laissera pas perdre les informations que
arr
est un tableau, sauf si vous le voulez vraiment. C'est pourquoi vous avez besoin d'un plâtre. Il est préférable que vous déclarezarr
comme un tableau, non pas comme un pointeur. Vous pouvez toujours passer aux fonctions qui acceptent un pointeur. Pourtant, gcc ne vous laissera pas de fuite de mémoire avec malloc:Si vous voulez une variable qui peut être soit un tableau ou un pointeur vers la mémoire allouée, créer une autre variable. Mieux encore, de créer une fonction qui accepte un pointeur et de le transmettre soit un tableau ou un pointeur.
OriginalL'auteur proski