2016-06-27 19 views
-2

で宣言されたのmalloc char配列が、私は(260K前後)が大きすぎるのtypedef構造体のchar型の配列を、持っているtypedefは構造体

#define LENGTH 260000 

typedef struct { 
    int longSize; 
    char hello[LENGTH ]; 
} p_msg; 

私は以下のように、このchar型の配列にmalloc関数を使用したいと思います:

error: expected ':', ',', ';', '}' or '__attribute__' before '=' token 

がどのように私はchar型の配列ををmallocすることができます

typedef struct { 
    int longSize; 
    char * hello= malloc(sizeof(char)); 
} p_msg; 

は、しかし、それは私にエラーを与えましたか?

+0

配列が同じサイズになるようにするには 'malloc(sizeof(char))'の代わりに 'malloc(LENGTH)'が必要です( 'LENGTH' 'char's、' sizeof(char) 'は常に1)。そのような型定義でやってはいけません。 – Dmitri

+0

LENGTHをそれよりも大きくする必要があります – Mic

答えて

2

構造体定義内から関数を呼び出すことはできません。単純に最初の構造体定義を大きな文字列で内部に保持し、次にそれを作成するときにmalloc(sizeof(p_msg))を実行する必要があります。

または、ポインタを内部に保持して、structインスタンスを作成するたびにmalloc()という結果を持つポインタを初期化することを忘れないでください。

あなたはポインタで構造体を取る機能を持っている場合は、あなたがこれを行うことができます:

int extMsg(p_msg *msgBuffer) 
{ 
    msgBuffer->longSize = 12; 
    msgBuffer->hello = malloc(12); 
    snprintf(msgBuffer->hello, 12, "hello %d", 42); 
    return 0; 
} 
+0

このtypedef構造体を関数のparamとして渡します。 int extMsg(p_msg * msgBuffer); malloc(sizeof(p_msg))を実行するにはどうすればよいですか?私は非常にC.に新しいです。助けをありがとう – Mic

+0

@Mic:私は私の答えにそのようないくつかのコードを追加しました。 –

0

をあなたはポインタ型を使用する必要があり、このコードを考えてみましょう。あなたが動的に割り当てたい場合は

#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    int longSize; 
    char * hello; 
} p_msg; 

int main() 
{ 
    p_msg msg; 
    //zeroing memory to set the initial values 
    memset(&msg, 0, sizeof(p_msg)); 
    //storing the size of char array 
    msg.longSize = 260000; 
    //dynamically allocating array using stored value 
    msg.hello = (char *)malloc(msg.longSize); 

    //using msg struct in some function 
    int retVal = someFunc(&msg); 


    //free hello array after you don't need it 
    free(msg.hello); 
    msg.hello = 0; 
}