LEH
LEH

Reputation: 221

'strcpy' with 'malloc'?

Is it safe to do something like the following?

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

int main(void)
{
    char* msg;

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

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

    return 0;
}

Or should the following be used?

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

Upvotes: 18

Views: 53682

Answers (6)

user411313
user411313

Reputation: 3990

Use:

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

And now it's easy and standard conforming:

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

Upvotes: 2

qbert220
qbert220

Reputation: 11556

Your original code does not assign msg. Attempting to strcpy to it would be bad. You need to allocate some space before you strcpy into it. You could use malloc as you suggest or allocate space on the stack like this:

char msg[15];

If you malloc the memory you should remember to free it at some point. If you allocate on the stack the memory will be automatically returned to the stack when it goes out of scope (e.g. the function exits). In both cases you need to be careful to allocate enough to be able to copy the longest string into it. You might want to take a look at strncpy to avoid overflowing the array.

Upvotes: 13

Prasoon Saurav
Prasoon Saurav

Reputation: 92854

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

This is UB. No second thoughts. msg is a wild pointer and trying to dereference it might cause segfault on your implementation.

msg to be pointing to a valid memory location large enough to hold "Hello World".

Try

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

or

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

Upvotes: 1

Mahesh
Mahesh

Reputation: 34615

The first version is not safe. And, msg should be pointing to valid memory location for "Hello World!!!" to get copied.

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

Upvotes: 2

pm100
pm100

Reputation: 50110

strdup does the malloc and strcpy for you

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

Upvotes: 39

SDReyes
SDReyes

Reputation: 9954

You need to allocate the space. Use malloc before the strcpy.

Upvotes: 0

Related Questions