質問
構造体を使用していますが、最大10個のポートを初期化します。ただし、プログラムが実行されているときは、それよりはるかに少ない可能性があり、実行時までわかりません。ただし、これは最大になります。私は通常、このような* portsを値型として使用してcallocとdelcareを使用して動的に割り当てるため、このような構造体を以前に実行したことがありません。
ただし、これは理解できません
*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?
そして
*ports = (struct port_t*) calloc(2, sizeof(*ports));
無料ストアに割り当てられた2つのポートオブジェクトを指す単一のポインタを割り当てているように見えますか?
なぜドット演算子と矢印演算子を使用しているのか理解できませんか? ports [0]-> port_id = 20; printf(" port_id:%d \ n&quot ;, ports [0]-> port_id);
#include <stdio.h>
#include <stdlib.h>
#define MAX_PORTS 10
struct port_t
{
int port_id;
char name;
} *ports[MAX_PORTS];
int main(void)
{
*ports = (struct port_t*) calloc(2, sizeof(*ports));
ports[0]->port_id = 20;
printf("port_id: %d\n", ports[0]->port_id);
return 0;
}
通常、私が渡されたのはこれです:
struct port_t
{
int port_id;
char name;
} *ports;
ports = (struct port_t*) calloc(2, sizeof(*ports));
次に、以下のいずれかを割り当てます。ただし、前のプログラマーは、私が一番上に表示したようにすべてを宣言したので、何も変更できません。
ports[0].port_id = 10;
ports->port_id = 10;
ご提案ありがとうございます
解決
*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?
はい、10個のポインターの配列を作成しています
*ports = (struct port_t*) calloc(2, sizeof(*ports));
...しかし、この行はナンセンスです。これと同じです:
ports[0] = (struct port_t*) calloc(2, sizeof(port_t));
ie。 2つのポートに十分なメモリを指すように最初のポインタを設定しています。
このような小さなものの場合、10個のポートを作成してすべてを使用するのではなく、はるかに理にかなっています:
#define MAX_PORTS 10
struct port_t
{
int port_id;
char name;
} ports[MAX_PORTS];
/* number of ports in use */
int numPorts = 0;
int main(void)
{
numPorts = 3;
for (int i=0; i<numPorts; i++) {
ports[i].port_id = i;
printf("port_id %d: %d\n", i, ports[i].port_id);
}
return 0;
}
他のヒント
最初のコードブロックには
struct port_t
{
int port_id;
char name;
} *ports[MAX_PORTS];
これはポインターの配列です。これは後で使用するときを意味します
ports[0]->port_id
配列内の最初のポインターを逆参照しています。あなたが実際にカロッキングしているもののサイズを取り巻くいくつかのさもあります。実際、10の配列を2の配列に置き換えています。そこにあるのは、一般にくてエラーが発生しやすいです。
あなたの意図は次のようなものに近いと思います:
struct port_t
{
int port_id;
char name;
} *ports;
int main(void)
{
*ports = (struct port_t*) calloc(2, sizeof(*ports));
ports[0].port_id = 20;
printf("port_id: %d\n", ports[0].port_id);
return 0;
}
C99を使用しているため、C99の変数配列宣言を使用して、本当に必要な場合、calloc()/ malloc()を回避できます。
port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;
ここでの秘onは、スタック上にあるため、その関数とそれによって呼び出される関数からのみ有効であるということです。その関数から戻ると、もちろん解放されます。
portsはport_tオブジェクトへのポインターの配列であるため、ports [0]を実行すると、オブジェクトではなくポインターを取得し、-&gt;でアクセスする必要があります
Cのポインターに関する適切なリソースを入手し、最初から最後まで読んでください。 C宣言の読み取りに関するチュートリアルもあります。ランダムな質問への回答を得ても、このトピックを理解することはできません。
こちらは読む価値のあるリンクです。