La fonction Malloc (allocation dynamique de la mémoire), résultant en une erreur lorsqu'il est utilisé dans le monde entier
#include<stdio.h>
#include<string.h>
char *y;
y=(char *)malloc(40); //gives an error here
int main()
{
strcpy(y,"hello world");
}
error: conflicting types for 'y'
error: previous declaration of 'y' was here
warning: initialization makes integer from pointer without a cast
error: initializer element is not constant
warning: data definition has no type or storage class
warning: passing arg 1 of `strcpy' makes pointer from integer without cast
Maintenant la vraie question est, ne peut-on pas faire de l'allocation dynamique de la mémoire à l'échelle mondiale? Pourquoi fait-il une erreur lorsque j'utilise malloc à l'échelle mondiale? Et le code fonctionne sans erreur si j'ai mis malloc
déclaration à l'intérieur de la fonction principale ou une autre fonction. Pourquoi est-ce donc?
#include<stdio.h>
#include<string.h>
char *y;
int main()
{
y=(char *)malloc(40);
strcpy(y,"hello world");
}
En plus de Tapis de réponse, n'oubliez pas de
#include <stdlib.h>
de sorte que vous obtenez une bonne déclaration pour malloc()
(sans votre "travail" code sera buggy sur la plupart des systèmes 64 bits).
OriginalL'auteur niko | 2011-07-19
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas exécuter du code en dehors des fonctions. La seule chose que vous pouvez faire à la portée globale est de déclarer des variables (et les initialiser avec des constantes de compilation).
malloc
est un appel de fonction, donc c'est non valide en dehors d'une fonction.Si vous initialiser un pointeur global variable avec
malloc
de votre main (ou toute autre fonction vraiment), il sera disponible pour toutes les autres fonctions où cette variable est dans la portée (dans votre exemple, toutes les fonctions à l'intérieur du fichier qui contientmain
).(Notez que les variables globales doivent être évités si possible.)
Oui, votre deuxième exemple est là pour ça.
Pour être plus précis, malloc alloue de la mémoire qui est "global" dans le sens où il est accessible par n'importe quelle fonction qui a un pointeur vers l'adresse. En déclarant " y " en dehors de toutes les fonctions, il est accessible par d'autres fonctions. Pour comprendre la différence, supposons qu'une fonction appelée malloc et retourne le résultat. Lorsque la fonction renvoie la, la mémoire est toujours allouée.
OriginalL'auteur Mat
bien, il n'est pas sur l'utilisation de malloc dans le monde. votre malloc processus doivent résider dans n'importe quelle fonction, principal ou à toute autre fonction définie par l'utilisateur. Au niveau mondial, il ne peut delare la variable. En tant que " y " est déclarée à l'échelle mondiale, la fonction malloc est un appel de fonction. que doit résider à l'intérieur de n'importe quelle fonction. Non seulement malloc, u ne peut pas appeler n'importe quelle fonction que vous avez appelé ici. vous ne pouvez déclarer une fonction global ou local, il y.
OriginalL'auteur Durgesh
Vous ne pouvez pas utiliser un appel de fonction lors de l'initialisation statique ou variable globale. Dans la suite de
séquence de code, nous déclarons une variable statique, puis à tenter de les initialiser à l'aide de
malloc:
static int *pi = malloc(sizeof(int));
Cela va générer une erreur de compilation message. La même chose arrive avec mondial
variables, mais peut être évitée pour les variables statiques à l'aide d'un état séparé pour allouer
la mémoire de la variable comme suit. Nous ne pouvons pas utiliser une instruction d'affectation avec
les variables globales, parce que les variables globales sont déclarées en dehors d'une fonction et exécutable
code, comme dans l'instruction d'affectation, doit être à l'intérieur d'une fonction:
static int *pi;
pi = malloc(sizeof(int));
Du compilateur point de vue, il y a une différence entre l'utilisation de la
l'initialisation de l'opérateur, =, et à l'aide de l'opérateur d'affectation, =.
OriginalL'auteur Ayush Srivastava