2011-03-18 3 views
11

Est-il sécuritaire de faire quelque chose comme ce qui suit?'strcpy' avec 'malloc'?

#include <stdio.h> 
#include <malloc.h> 
#include <string.h> 

int main(void) 
{ 
    char* msg; 

    strcpy(msg, "Hello World!!!"); //<--------- 

    printf("%s\n", msg); 

    return 0; 
} 

Ou faut-il utiliser ce qui suit?

char* msg = (char*)malloc(sizeof(char) * 15); 
+5

Vous avez besoin du malloc, sinon msg est juste un pointeur qui pend. –

+3

Utilisez 'malloc', mais supprimez la distribution et' sizeof (char) '. L'utilisation correcte est 'char * msg = malloc (15);' –

+0

Aussi 'malloc()' est déclaré dans '' pas '' – pmg

Répondre

11

Votre code original n'assigne pas de message. Tenter de le strcpy serait mauvais. Vous devez allouer de l'espace avant de vous y connecter. Vous pouvez utiliser malloc comme vous le suggérez ou allouer de l'espace sur la pile comme ceci:

char msg[15]; 

Si vous malloc la mémoire, vous devez vous rappeler de le libérer à un moment donné. Si vous allouez sur la pile, la mémoire sera automatiquement renvoyée à la pile lorsqu'elle sortira de la portée (par exemple, la sortie de la fonction). Dans les deux cas, vous devez faire attention à allouer suffisamment pour pouvoir copier la chaîne la plus longue. Vous pourriez vouloir jeter un oeil à strncpy pour éviter de déborder le tableau.

+0

si la taille de msg est inférieure à la longueur de la chaîne, disons "char msg [3]; strcpy (msg," abcdefg ");", serait ok? Si maintenant, je customise le msg, la sortie sera-t-elle "abcdefg"? – Alcott

+1

Non ce ne sera pas. 'char msg [3]' alloue de l'espace pour 3 caractères. Vous ne pouvez pas copier 8 caractères dans cet espace (7 lettres plus un terminateur nul). – qbert220

2

La première version n'est pas sûre. Et, msg doit pointer vers l'emplacement de mémoire valide pour "Hello World !!!" pour être copié.

char* msg = (char*)malloc(sizeof(char) * 15); 
strcpy(msg, "Hello World!!!"); 
+2

ne lance pas le retour de 'malloc' et n'utilise pas' sizof (char) '. –

+2

pourquoi pas sizeof (char)? – pm100

+0

char est garanti à 1 octet dans c – yampelo

1

Vous devez allouer de l'espace. Utilisez malloc avant le strcpy.

26

strdup fait le malloc et strcpy pour vous

char *msg = strdup("hello world"); 
+1

strdup n'est pas standard C, pas C89 et pas C99 – user411313

+6

POSIX est une norme. Il y a beaucoup de choses que nous utilisons qui ne sont pas C89 ou C99. Ce n'est pas une raison pour ne pas utiliser quelque chose d'aussi simple. Veuillez utiliser strdup avant d'écrire une macro dense comme MYSTRDUP(). strdup prend une ligne à implémenter en tant que fonction, et franchement, devrait être dans la norme. – codenheim

+0

Certainement, mais il vaut la peine de mentionner que c'est dans POSIX. –

1
char* msg; 
strcpy(msg, "Hello World!!!"); //<---------Ewwwww 
printf("%s\n", msg); 

C'est UB. Pas de seconde pensée. msg est un pointeur sauvage et essayer de le déréférencer peut provoquer une erreur de segmentation sur votre implémentation.

msg à pointer vers un emplacement de mémoire valide assez grand pour contenir "Hello World".

Essayez

char* msg = malloc(15); 
strcpy(msg, "Hello World!!!"); 

ou

char msg[20]; 
strcpy(msg, "Hello World!!!"); 
1

Utilisation:

#define MYSTRDUP(str,lit) strcpy(str = malloc(strlen(lit)+1), lit) 

Et maintenant c'est facile et standard conforme:

char *s; 
MYSTRDUP(s, "foo bar"); 
+0

sauf dans le cas où malloc a échoué – pm100