'strcpy' с 'malloc'? - PullRequest
       60

'strcpy' с 'malloc'?

14 голосов
/ 18 марта 2011

Безопасно ли делать что-то вроде следующего?

#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);

Ответы [ 6 ]

32 голосов
/ 18 марта 2011

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

char *msg = strdup("hello world");
12 голосов
/ 18 марта 2011

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

char msg[15];

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

2 голосов
/ 18 марта 2011

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

char* msg = (char*)malloc(sizeof(char) * 15);
strcpy(msg, "Hello World!!!");
1 голос
/ 18 марта 2011

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

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

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

char *s;
MYSTRDUP(s, "foo bar");
1 голос
/ 18 марта 2011
 char* msg;
 strcpy(msg, "Hello World!!!");  //<---------Ewwwww
 printf("%s\n", msg); 

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

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

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

или

char msg[20]; 
strcpy(msg, "Hello World!!!");
1 голос
/ 18 марта 2011

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

...