'strcpy' с '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;
}

Или следует использовать следующее:

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

Ответ 1

Ваш исходный код не назначает msg. Пытаться к ней было бы плохо. Вам нужно выделить некоторое пространство перед тем, как вы в него вложите. Вы можете использовать malloc, поскольку вы предлагаете или выделяете пространство в стеке следующим образом:

char msg[15];

Если вы malloc памяти, вы должны помнить, чтобы освободить его в какой-то момент. Если вы выделите в стек, память будет автоматически возвращена в стек, когда он выходит из области действия (например, функция выходит). В обоих случаях вам нужно быть достаточно осторожным, чтобы иметь возможность копировать в него самую длинную строку. Вы можете захотеть взглянуть на strncpy, чтобы избежать переполнения массива.

Ответ 2

strdup делает malloc и strcpy для вас

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

Ответ 3

Первая версия небезопасна. И msg должен указывать на правильную ячейку памяти для "Hello World!!!" для копирования.

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

Ответ 4

Вам нужно выделить пространство. Используйте malloc перед strcpy.

Ответ 5

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

Это UB. Никаких вторых мыслей. msg является диким указателем и пытается разыменовать его, что может вызвать segfault для вашей реализации.

msg, чтобы указывать на допустимую ячейку памяти, достаточно большую для хранения "Hello World".

Try

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

или

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

Ответ 6

Использование:

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

И теперь это легко и стандартно соответствует:

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