Cでreallocを使用する方法[重複]

Nov 25 2020

realloc関数を使用してメモリを再割り当てしようとしています。以前にmallocを使用する必要があることがわかりましたが、次の文字列を作成しているため、使用する必要があるかどうかわかりません。

char string[] =  "fun";

スペースを追加しようとすると、realloc関数は機能しますか?

それは私の質問に私をもたらします、私は単に文字列の最後に1文字を追加しようとしています、たとえば「p」としましょう、しかし何らかの理由でプログラムはそれを実行するたびにrealloc行でクラッシュします。

これが私の完全なコードです:

int main()
{
char string[] =  "fun" ;
str_func(string);
printf("%s", string);
return 0;
} 

void str_func(char* str)
{
str = (char*)realloc(str, strlen(str) + 2);
strcat(str, "p");
}

また、「文字列」へのポインタを作成してポインタを送信しようとしましたが、同じ結果になりました。

回答

1 Lundin Nov 25 2020 at 19:32

スペースを追加しようとすると、realloc関数は機能しますか?

いいえ、その配列はヒープに割り当てられていないためです。あなたの場合、スタックに割り当てられている可能性が高く、サイズを変更することはできません。簡単に言えばrealloc、ポインタを認識せず、それをどうするかわからないが、とにかく何かをしようとするため、クラッシュする。

realloc以前にに渡されたポインタmalloc、またはnullポインタでのみ呼び出すことができます。これが、これらの機能の仕組みです。

詳細については、「スタックとヒープに何が割り当てられるか」を参照してください。。

1 Useless Nov 25 2020 at 19:58

以前にmallocを使用する必要があることを確認しましたが、使用する必要があるかどうかわかりません

あなたがいる場合必要な使用をmallocすることができます前にrealloc何か、そして、定義により、あなたがしなければならない唯一reallocのものは、もともとに割り当てられましたmalloc

「必要」と「必須」の間に存在しないスペースを見つけようとしています。

...何らかの理由で、プログラムはreallocでクラッシュします

あなたはすでにあなたが知っていると述べた必要使用しますmalloc。次にmalloc、を使用しなかったので、なぜこれが問題になるのかを尋ねています。あなたは、少なくとも可能性試してあなたはそれが問題を解決するかどうかを確認するために、あなたがする必要がある「知っている」ことをやって。

プログラムはおそらく次のようになります

int main()
{
  /* array is an automatic local variable. It wasn't dynamically allocated
     in the first place, so can't be dynamically re-allocated either.
     You cannot (and don't need to) free it either, it just goes out of scope
     like any other automatic variable.
  */
  char array[] = "fun";

  /* you need to use malloc (or one of the other dynamic allocation functions)
     before you can realloc, as you said yourself */
  char *dynamic = malloc(1+strlen(array));
  memcpy(dynamic, array, 1+strlen(array));

  /* realloc can move your data, so you must use the returned address */
  dynamic = str_func(dynamic);
  printf("old:'%s', new:'%s'\n", array, dynamic);

  /* not really essential since the program is about to exit anyway */
  free(dynamic);
} 

char* str_func(char* str)
{
  char* newstr = realloc(str, strlen(str) + 2);
  if (newstr) {
    strcat(newstr, "p");
    return newstr;
  } else {
    /* we failed to make str larger, but it is still there and should be freed */
    return str;
  }
}

元の状態は完全に正しくありません。実際には、ポインタがに渡されます。 realloc

...以前によって割り当てられなければならないmalloc()calloc()またはrealloc()、まだ自由に通話やreallocをして解放されません

[または] ptrがNULLの場合、動作はを呼び出すのと同じmalloc(new_size)です。

paxdiablo Nov 25 2020 at 19:31

realloc関数は、元々 (例えば、割り当て関数の小さなグループで作成されたもので動作しmalloccallocまたはreallocそれ自体)、またはNULLポインタ。これらのstringいずれでもないため、コードは明確に定義されていません。