まず、 sizeof (xxx)(xxxは任意の左の値の式(変数))は、do sizeof(タイプxxx )と常に同等であることを理解する必要があります。したがって、実際にsizeof(str)を実行しているのは、char *のサイズ、つまり他のポインターのサイズを返すことです。32ビットアーキテクチャでは4になり、64ビットアーキテクチャでは8になります。
したがって、他の人も説明しているように、割り当てる文字列の長さを知ってから、1を追加して端末\ 0を格納する必要があります。Cは、文字列の最後に置くために暗黙的に使用します。
しかし、必要なこと(文字列をコピーして必要なスペースを割り当てる)を実行するには、 strdupを使用する方が簡単で効率的です。これは、まさにそれを実行します:mallocとstrcopy。
また、自分で割り当てたスペースを解放することも忘れないでください(malloc、calloc、strdup、またはその他の割り当て関数を使用)。Cでは、割り当てられた変数がスコープ外になっても消えません。プログラムが終了するまで使用され続けます。それはあなたがメモリリークと呼ぶものです。
#include <string.h> /* for strdup, strlen */
#include <stdio.h> /* for printf */
int main()
{
char * str = "string";
char * copy = strdup(str);
printf("bytes at least allocated for copy: %d\n", strlen(copy)+1);
printf("%s\n", copy);
free(copy);
}
最後のポイント:mallocを呼び出すときに割り当てられたサイズがよくわからないため、メッセージを少なくとも割り当てられたバイトに変更しました。多くの場合、要求したスペースよりもわずかに多くのスペースが割り当てられます。多くのメモリマネージャでは、空きブロックは非表示のデータ構造を使用してリンクされており、割り当てられたブロックには少なくともそのような構造を含めることができる必要があります。別の理由は、割り当てられたブロックが常に任意のタイプと互換性があるように配置されることです。アラインメント。
Cをもう少しよく理解するのに役立つことを願っています。