私は少し新しくて、メモリの仕組みを理解するのに問題があります。特にmemcpy
のような組み込み関数があります。ここで C - Mallocとmemcpy(メモリ管理)
struct data_t {
int datasize;
void *data;
};
使用していstruct
だと、ここで私はそれを使用している補助機能です:
struct data_t *data_create(int size)
{
struct data_t *dt=malloc(sizeof(struct data_t)+size);
dt->datasize=size;
dt->data="1234567890a";
return dt;
}
今すぐ
main
機能で、私はこれをやって何の問題もありません。
struct data_t *data = data_create(1024);
data->data="123456a";//just an example
しかし、これによってSegフォルトが発生します。
memcpy(data->data,"123456a",strlen("1234567890a")+1);
私の質問はなぜですか?そして、どうすればそれを避けることができますか? 私はC言語に新しいので、メモリとCのやりとりがちょっと新鮮であることに気をつけてください。
ありがとうございました。
編集:それは動作します!どうもありがとうございました。データポインタが完全に欠落しています。今はvalgrindによるとすべてがうまくいきます。
スペースが初期割り当てに配分されました。ポインタは単に割り当てられたスペースを指すように設定されていませんでした。 –
@JonathanLeffler:はい、Askerは最初に割り当てるときに余分なスペースを割り当てました。ポイントに初期化しておく必要がありました。一度にすべてを割り当てる特別な必要がなければ、私は依然として明示的な呼び出しを好むでしょう。 – phoxis
これは "mallocから返されたポインタを明示的にキャストしなければならない"という問題を解決するために、 "無効な変換を 'void *'から 'data_t *' [-fpermissive]に変更します。 – VasaraBharat