2009-03-06 13 views
2

構造体を使用していますが、最大10個のポートを初期化します。しかし、プログラムが実行されているときは実行時間がそれほど多くない可能性があります。実行時まではわかりません。しかし、これは最大値になります。私は通常、callocとdelcareを使用してこの* portsを値の型として動的に割り当てているので、前にこのような構造体を作成したことはありません。構造体c動的にメモリを割り当てます

しかし、私は自由な店に割り当てられた2つのポートオブジェクトを指すポインタを1つ割り当てていますように、この

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects? 

そして

*ports = (struct port_t*) calloc(2, sizeof(*ports)); 

が見える理解できないのですか?

ドット演算子で矢印演算子を使用している理由を理解できません。 ports [0] - > port_id = 20;printf( "port_id:%d \ n"、ports [0] - > port_id);

struct port_t 
{ 
    int port_id; 
    char name; 
} *ports; 

ports = (struct port_t*) calloc(2, sizeof(*ports)); 

そして、以下、次のいずれかに割り当てる:私は合格でやっていることは通常

#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; 
} 

は、これです。しかし、前のプログラマーは私がトップに表示したようなものを宣言しているので、何も変更できません。

ports[0].port_id = 10; 
ports->port_id = 10; 

任意の提案のための多くのおかげで、

+0

compilierのGCCのC99 – ant2009

答えて

6
*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つのポートに十分なメモリを指すように設定しています。

#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; 
} 
+0

十分upvoteすることはできません:それははるかに意味が10個のポートを作ることになるだろうが、それらをすべて使用していないような小さなものについては

。 10のport_tが不必要にコードをオーバーコンプリートするようなものを動的に割り当てる – jdizzle

7

あなたの最初のコードブロックは、ポインタの配列である

struct port_t 
{ 
    int port_id; 
    char name; 
} *ports[MAX_PORTS]; 

を持っています。これは後で使用することを意味します

ports[0]->port_id 

この配列の最初のポインタを間接参照しています。あなたが実際に呼んでいるもののサイズを取り巻くいくつかの醜さもあります。あなたは実際には10の配列を2の配列に置き換えています。あなたがそこにあるのは、一般的には醜いですし、エラーが起こりやすいです。 C99の変数を使用して

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を使用しているので、あなたは避けることができはcalloc()あなたが本当ににしたい場合は/のmalloc()、

私はあなたの意図は、の線に沿ってより多くあると考えています配列宣言。

port_t array_on_mains_stack[some_runtime_port_count]; 
ports = array_on_mains_stack; 

それはスタック上にあるので、それはその関数とそれによって呼び出される関数からのみ有効です。その機能から戻ると、もちろん解放されます。

2

ポート[0]あなたはポインタではなく、オブジェクトを取得し、あなたがそれにアクセスする必要があるポートを行うことであるとオブジェクトをport_tへのポインタの配列なので、 - >

グラブ内のポインタに優れたリソースCから読んでそれを読んでください。 C宣言の読み方についてのチュートリアルもあります。ランダムな質問に答えを出すことで、このトピックを理解することはできません。

Hereのリンクを読む価値があります。

関連する問題