web-dev-qa-db-ja.com

'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);
14
LEH

元のコードはmsgを割り当てません。それにstrcpyしようとすると悪いでしょう。 strcpyを実行する前に、スペースを割り当てる必要があります。提案どおりにmallocを使用するか、次のようにスタックにスペースを割り当てることができます。

char msg[15];

メモリをmallocする場合は、ある時点でそれを解放することを忘れないでください。スタックに割り当てると、メモリはスコープ外になると(関数が終了するなど)、自動的にスタックに戻されます。どちらの場合も、最長の文字列をコピーできるように十分に割り当てるように注意する必要があります。配列のオーバーフローを回避するために、strncpyを確認することをお勧めします。

12
qbert220

strdupはmallocとstrcpyを実行します

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

使用する:

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

そして今、それは簡単で標準的な適合です:

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

最初のバージョンは安全ではありません。また、msgは「HelloWorld !!!」の有効なメモリ位置を指している必要があります。コピーされます。

char* msg = (char*)malloc(sizeof(char) * 15);
strcpy(msg, "Hello World!!!");
2
Mahesh
 char* msg;
 strcpy(msg, "Hello World!!!");  //<---------Ewwwww
 printf("%s\n", msg); 

これはUBです。考え直しはありません。 msgはワイルドポインタであり、逆参照しようとすると、実装でセグメンテーション違反が発生する可能性があります。

msg"Hello World".を保持するのに十分な大きさの有効なメモリ位置を指している

試してみてください

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

または

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

スペースを割り当てる必要があります。 mallocの前にstrcpyを使用します。

1
SDReyes