J'ai appris que le tableau de charcuterie n'utilise pas et dans Scanf, car le point de conservation de Char Store, pas la chaîne elle-même.
int *arr = (int *)malloc(sizeof(int)*3);
scanf("%d", &arr[1]);
3 Réponses :
S1 code> est un tableau de caractères. Le nom de la matrice (S1) est un pointeur à caractère, et vous n'avez donc pas besoin de & code> avec scanf - car% s prévoit de lire le tableau de caractères. int arr[3] = (int *)malloc(sizeof(int)*3);
scanf("%d", &arr[1]);
S1 = Adresse, & S1 = adresse de l'adresse. Pourquoi est-ce la même chose?
@ 4Rigener: La réponse est imprécise. S1 CODE> est un tableau (c'est--------comme un objet avec un type de matrice), et donc & s1 code> est un pointeur sur un objet de type tableau. & s1 code> et & s1 [0] code> point sur le même endroit, mais ce sont des pointeurs de différents types. La confusion vient du fait que lorsque vous utilisez S1 code> en tant qu'argument de fonction ou dans de nombreux autres contextes, il "se désintègre" à un pointeur à son premier élément. Voir Cette réponse .
Lorsque vous numérisez le tableau de caractères (chaîne), dans votre cas S1, vous n'avez pas besoin et car S1 stocke un pointeur sur le premier élément (l'élément avec index 0) de ce tableau.
En ce qui concerne l'allocation dynamique, la valeur de retour MALLOC est un pointeur sur une distance dans la mémoire où votre tableau sera stocké. Donc, votre déclaration devrait ressembler à ceci: Si vous souhaitez initialiser l'ensemble de l'ensemble, vous pouvez écrire un cycle facile pour cela. Je vous recommanderai également de lire une documentation sur Malloc et un article " calloc vs malloc ". p> bonne chance :) p> < / p>
Ceci est complètement faux: Parce que vous essayez d'allouer la mémoire à un tableau qui n'est pas autorisé. Lorsque vous faites cela, la vue en mémoire serait une chose comme celle-ci (en supposant que lorsque vous prenez une entrée dans le premier élément de tableau S'il vous plaît laissez-moi savoir si vous en avez d'autres questions. P> p>
Il devrait être: p> Malloc code> est le succès): p> arr code> est un pointeur pointant sur l'adresse de base de la mémoire.
arr [1] code> est le premier élément du tableau (un seul élément de tableau d'entiers arr tout code>) et de
& arr [1] code> est l'adresse du premier élément de tableau Ar code>. p> arr code> Vous devez transmettre l'adresse du premier élément de matrice à scanf () code> qui est & arr [1] code>. P>. & code> utilisé avec scanf () code> Arguments n'a rien à voir avec une allocation dynamique. Si vous souhaitez entrer une entrée dans un élément de la matrice de longueur fixe (taille déterminée à l'heure de compilée), la syntaxe sera la même: p>
Une bonne alternative à arr = malloc (taille de (int) * 3); code> est arr = malloc (taille de * arr * 3); code>. Plus facile à écrire correctement, examiner et entretenir.
@chux: Je préfère MALLOC (3 * Tailleof * Art) code>. Ensuite, l'opérande de taille de code> est un peu plus facile à distinguer visuellement. En outre, si vous faites une matrice multidimensionnelle, MALLOC (lignes * colonnes * Tailleof * p) code> correspond à la commande Les dimensions seraient dans une définition de matrice et continue la taille de la plus grande chose au plus petit, avec la taille d'un seul objet dernier.
@EricpostPischil lignes * colonnes * Tailleof * p code> a un désavantage sur Tailleof * p * lignes * colonnes code> lorsque lignes, colonnes code> peut être plus étroite que < code> taille_t code> - par exemple int code>. Un produit avec Tailleof * P * lignes * colonnes code> qui ne déborde pas peut trop déborder avec des lignes * Colonnes * Tailleof * P Code>. D'où ma préférence pour mener la multiplication avec un argument taille_t code>. Ewows, passez du plus grand type nécessaire à peut-être des cils étroits plutôt que de visa-versa. Bien sûr, avoir seulement 2 arguments de types mixtes ou tous les 3 comme taille_t code> permet de préférer votre préférence sans cette préoccupation.
@ H.s. int * arr = (int *) malloc (Tailleof (int) * 3); code> peut être correct. Ainsi, MALLOC vient d'accorder un espace mémoire pour la valeur et le pointeur de chaîne de charret, int sauvegarde numéros. Droite?
@ 4Rigener Non, votre compréhension est complètement fausse. Semble, vous avez une confusion autour du concept de pointeurs dans C code>. Un type de pointeur décrit un objet dont la valeur fournit une référence à une entité du type référencé. Cela signifie que lorsque vous écrivez - int * p; code>, ici p code> est un pointeur pouvant stocker l'adresse d'un type int code>. De même, Char * p; code>, ici p code> est un pointeur pouvant stocker l'adresse d'un type char code> et que vous devez désigner un pointeur lorsque vous Voulez-vous accéder aux données / valeur dans la mémoire que le pointeur pointe vers. En outre, ne pas lancer le Malloc code> retour .... Cond ..
@ 4Rigener En outre, il semble que vous ayez une confusion autour de la matrice. N'oubliez pas que ceci - sauf quand il s'agit de l'opérande de la taille de l'opérateur, de l'opérateur _ALignOf, ou de l'opérateur unaire, ou est un littéral à chaîne utilisé pour initialiser un tableau, une expression qui a le type '"tableau de type" est converti en Une expression avec le type '' pointeur de type '' qui pointe vers l'élément initial de l'objet Array ...... (C11 6.3.2.1P3).
arr [1] n'est pas un pointeur, vous devriez donc ajouter et avant
scanf ("% s", S1); code> est équivalent àscanf ("% s", & s1 [0]); code> etscanf ("% d" , & arr [1]); code> équivaut àscanf ("% d", arr + 1); code>.int arr [3] = (int *) malloc (Tailleof (int) * 3) code> n'est pas un code valide de toute façon. Le résultat deMALLOC () code>, qu'il soit jeté ou non, ne peut pas être utilisé pour initialiser un tableau.