'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");