次のようなことをしても安全ですか?
#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);
元のコードはmsgを割り当てません。それにstrcpyしようとすると悪いでしょう。 strcpyを実行する前に、スペースを割り当てる必要があります。提案どおりにmallocを使用するか、次のようにスタックにスペースを割り当てることができます。
char msg[15];
メモリをmallocする場合は、ある時点でそれを解放することを忘れないでください。スタックに割り当てると、メモリはスコープ外になると(関数が終了するなど)、自動的にスタックに戻されます。どちらの場合も、最長の文字列をコピーできるように十分に割り当てるように注意する必要があります。配列のオーバーフローを回避するために、strncpyを確認することをお勧めします。
strdupはmallocとstrcpyを実行します
char *msg = strdup("hello world");
使用する:
#define MYSTRDUP(str,lit) strcpy(str = malloc(strlen(lit)+1), lit)
そして今、それは簡単で標準的な適合です:
char *s;
MYSTRDUP(s, "foo bar");
最初のバージョンは安全ではありません。また、msg
は「HelloWorld !!!」の有効なメモリ位置を指している必要があります。コピーされます。
char* msg = (char*)malloc(sizeof(char) * 15);
strcpy(msg, "Hello World!!!");
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!!!");
スペースを割り当てる必要があります。 malloc
の前にstrcpy
を使用します。