0

以下のように配列サイズを手動で指定しました。

int main(int argc, char *argv[] )
{
    char buffer[1024];
    strcpy(buffer,argv[1]);
    ...
}

ただし、引数で渡されるデータがこのサイズを超えると、問題が発生する可能性があります。

これはメモリを動的に割り当てる正しい方法ですか?

int main(int argc, char *argv[] )
{
    int length;
    char *buffer;
    length = sizeof(argv[1]); //or strlen(argv[1])?
    buffer = (char*)malloc(length*sizeof(char *));
    ...
}
4

6 に答える 6

4

sizeofの大きさを教えてくれますchar*。あなたはstrlen代わりに欲しい

if (argc < 2) {
    printf("Error - insufficient arguments\n");
    return 1;
}
length=strlen(argv[1]);
buffer = (char*)malloc(length+1); // cast required for C++ only

ここで他のいくつかの変更を提案しました

  • buffernullターミネータ用に余分なバイトを追加する必要があります
  • ユーザーがargv[1]
  • sizeof(char *)文字列に必要なストレージを計算するときは正しくありません。AC 文字列はchars の配列であるため、 が必要ですsizeof(char)。これは 1 であることが保証されているため、乗算する必要はありません。

あるいは、Posix 互換システムで実行している場合は、単純化して代わりにstrdupを使用できます。

buffer = strdup(argv[1]);

最後に、使いfree終わったらこの記憶を確認してください

free(buffer);
于 2013-08-30T15:08:20.387 に答える
1

正しい方法はstd::string、C++ を使用して作業を任せることです。

#include <string>

int main()
{
    std::string buffer = argv[1];
}

しかし、あなたがそれを難し​​い方法でやりたいのなら、これは正しいです

int main()
{
    int length = strlen(argv[1]);
    char* buffer = (char*)malloc(length + 1);
}

C スタイルの文字列で使用されるヌル ターミネータの +1 を忘れないでください。

于 2013-08-30T15:09:44.533 に答える
1

C++ では、これを実行して、適切なデータ構造で引数を取得できます。

const std::vector<std::string>(argv, argv + argc)

于 2013-08-30T15:14:57.920 に答える
1
length= strlen(argv[1]) //not sizeof(argv[1]);  

//extra byte of space is to store Null character.    
buffer = (char*)malloc((length+1) * sizeof(char));

は常に 1 であるためsizeof(char)、これを使用することもできます。

  buffer = (char*)malloc(length+1);                       
于 2013-08-30T15:08:38.183 に答える
0

newまず、C++ を使用する場合は、代わりに使用する方がよいと思いますmalloc

次に、malloc サイズが false です: buffer = malloc(sizeof(char) * length);char* バッファーではなく char バッファーを割り当てるためです。

3 番目に、文字列の最後にさらに 1 バイトを割り当て、'\0' を格納する必要があります。

最後に、sizeof は文字列ではなく型のサイズのみを取得します。文字列のサイズを取得するには strlen を使用する必要があります。

于 2013-08-30T15:11:13.603 に答える
-1

文字列の終端の null バイトを保持するために、余分なバイトを追加する必要があります。

length=sizeof(argv[1]) + 1;

それなら大丈夫なはずです。

于 2013-08-30T15:08:06.470 に答える