2009-03-09 23 views
0

C99 gcc構造体callc c

このエラーは引き続き発生します。私はメインの外側に構造体を持っています。そしてmainの中で私はcallocを使ってスタックに割り当てようとしています。私は何が間違っているのか分からないようです。何かアドバイスのため

おかげで、

エラー:前に予想式「)」トークン

/* global */ 
struct port_data_t                  
{                      
    size_t task_id;                  
    pthread_t *thread_id;                
    size_t start_port;                 
    size_t number_ports;                 
} *port_data;                   


/* main function */ 
struct port_data_t *port_data = (struct task_data_t*) calloc(4, sizeof(port_data*)); 
+0

割り当てようとしているタイプと異なるタイプにキャストする理由はありますか? –

+0

私はいくつかの変更を加えました。これはすべきである: struct port_data_t * port_data =(struct port_data_t *)calloc(4、sizeof(port_data *)); – ant2009

+0

私はコード全体を投稿する必要があるかもしれないと思うかもしれません(長すぎない場合) –

答えて

7

calloc(4, sizeof(*port_data)):注* befor var name。

4

)*ないのsizeof(port_data)はsizeof(port_data_tをする必要があります。前者はport_data_t構造体のサイズです。後者は何も意味しません。

+0

* を使用するほうが、タイプが変更された場合に破損が少なくなります。 –

+0

間違っていない限り、sizeof(port_data_t)でなく、sizeof(port_data_t)でなければなりません。 –

+0

プラス!異端者を殺す! :) –

0

Jeffamaphoneが指摘しているように、task_data_tは文脈から外れています。また、Crashworksによって指摘されているように、構造体の配列をport_dataに入れるには、sizeof(port_data_t)を試してください。

sizeof(port_data *)を使うと、port_data_tのポインタにsizeofポインタを割り当てることができます。このポインタはほとんどの場合、ほとんどの場合に非常に便利です。これに

struct port_data_t *port_data = (struct task_data_t*) calloc(4, sizeof(port_data*)); 

+0

'受け入れ1は、 '* <割り当てられたPTR>'間の誤解を作成することができ起こす」これが最良の答えだと思うし、 ... –

+0

いいえ、彼はsizeof(struct port_data_t)を意味します。私はGCCでこれをチェックしており、そこにstructキーワードがなければ動作しません。 –

+0

あまりにも多くのC++: '( –

1

は、これを変更してみてください

port_data = (struct port_data_t*) calloc(4, sizeof(*port_data)); 

は少し良く働くかもしれません。 port_dataをグローバル構造体として宣言した場合は、struct port_data_tとして再宣言する必要はありません。 GCCはすでにそれを知っているはずです。もちろん、私はどうなるか、それはこれです:

port_data = (struct port_data_t*) calloc(4, sizeof(struct port_data_t)); 

しかし、私はsizeof()に変数を入れて好きではありません。私は、習慣からちょうどそこにタイプを入れることに固執しようとします。さらに、ポインタがどのように逆参照される必要があるかに関するあいまいさを解決します。

+0

もちろん、ポインタ型を変更すると、変数を使う方がはるかに安全です... –

1
#include <malloc.h> 
#include <pthread.h> 

typedef struct port_data_t { 
    size_t task_id; 
    pthread_t *thread_id; 
    size_t start_port; 
    size_t number_ports; 
} port_data_t; 

port_data_t* f() { 
    port_data_t* ports = (port_data_t*)calloc(4, sizeof(port_data_t)); 
    return ports; 
}