あなたが説明したことについては、構造体にメモリを割り当てる必要はありません。むしろ、メンバーchar *addr;
にメモリを割り当てる必要がありchar *inst;
ます。その構造体の 1 つのコピーが必要な場合は、コードの最初のセクションで初期化と値の割り当て方法を示します。配列が必要な場合は、2 番目のコード例で違いを示します。
これは、単一の構造体行のメンバーにメモリを割り当てる方法を示しています。
typedef struct
{
char* addr;
char* inst;
}LINE;
LINE line;
int main(void)
{
strcpy(line.addr, "anystring"); //will fail
line.addr = malloc(80);
line.inst = malloc(80);
strcpy(line.addr, "someString");//success;
strcpy(line.inst, "someOtherString");//success;
}
構造体行の配列の場合...
typedef struct
{
char* addr;
char* inst;
}LINE; //same struct definition
LINE line[10]; //but create an array of line here.
int main(void)
{
int i;
for(i=0;i<10;i++)
{
line[i].addr = malloc(80);
line[i].inst = malloc(80);
}
for(i=0;i<10;i++)
{
strcpy(line[i].addr, "someString");
strcpy(line[i].inst, "someOtherString");
}
//when done, free memory
for(i=0;i<10;i++)
{
free(line[i].addr);
free(line[i].inst);
}
}
アドレス コメントに追加
@Adam Liss からのこの回答の下にあるコメントに対処すると、次のコードはstrdup()を使用した次の改善を示しています。1 ) 必要なメモリのみを使用します。2) メモリの作成とコピー操作を 1 つのステップで実行するため、次のブロック:
for(i=0;i<10;i++)
{
line[i].addr = malloc(80);
line[i].inst = malloc(80);
}
for(i=0;i<10;i++)
{
strcpy(line[i].addr, "someString");
strcpy(line[i].inst, "someOtherString");
}
なる:
for(i=0;i<10;i++)
{
line[i].addr = strdup("someString");
line[i].inst = strdup("someOtherString");
}
もう 1 つ注意:主な概念への焦点が混乱するのを避けるため、上記の例にはエラー処理が含まれていません: ただし、完全を期すために、 と の両方malloc()
が strdup()
失敗する可能性があるため、これら 2 つの関数のそれぞれの実際の使用法には、使用する前にテストを含める必要があります。 、例:
それよりも
line[i].addr = strdup("someString");
line[i].inst = strdup("someOtherString");
コードには次を含める必要があります
line[i].addr = strdup("someString");
if(!line[i].addr)
{
//error handling code here
}
line[i].inst = strdup("someOtherString");
if(!line[i].inst)
{
//error handling code here
}