17

次のようなことをしても安全ですか?

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

6 に答える 6

36

strdup は malloc と strcpy を実行します

char *msg = strdup("hello world");
于 2011-03-18T16:31:03.087 に答える
12

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

char msg[15];

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

于 2011-03-18T16:29:21.190 に答える
2

使用する:

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

そして今、それは簡単で標準に準拠しています:

char *s;
MYSTRDUP(s, "foo bar");
于 2011-03-18T17:57:42.130 に答える
2

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

char* msg = (char*)malloc(sizeof(char) * 15);
strcpy(msg, "Hello World!!!");
于 2011-03-18T16:27:36.203 に答える
1

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

于 2011-03-18T16:27:57.330 に答える
1
 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!!!");
于 2011-03-18T16:37:32.363 に答える