2012-03-20 11 views
-1

conbuf.bufferにバイトを受け取りたいです。テスト1またはテスト2のいずれかがOKです。私はprintfステートメントの値を見ていません。ポインタを正しく渡していますか?どのように構造体内のcharポインタにメモリを割り当てるのですか?構造体C++のcharポインタにアクセスしてメモリを割り当てます。

typedef struct cBuf 
{ 
    int size; 
    char *buffer; 
} cbuf; 

class A 
{ 
    cbuf conbuf; 
    void test(); 
} 

void A::test() 
{ 
    int buffersize = 20; 
    char buf[buffersize]; 

    conbuf.buffer = (char *)malloc(buffersize * sizeof(char *)); 

    // test 1 
    int n = socket.receivebytes(conbuf.buffer, buffersize); 

    // test 2 
    //int n = socket.receivebytes(buf, buffersize); 
    //strcpy(conbuf.buffer, buf); 

    printf("conbuf.buffer %s \n", conbuf.buffer); 
} 
+1

-1:実際にコンパイルするコードを投稿できますか? –

+0

ソケットを介して送信される正確なデータは何ですか? – Mark

+2

手動メモリ割り当ての代わりに 'std :: vector'を使います。 –

答えて

1

この

conbuf.buffer = (char *)malloc(buffersize * sizeof(char *)); 

する必要があります。この

conbuf.buf = (char *)malloc(buffersize * sizeof(char)); //allocate space for char not pointer to char. Your struct only has buf member not "buffer" 
+1

正しい間に彼の問題を解決するつもりはありません – pezcode

+0

sizeof(char *)は常にsizeof(char)と等しいです。 – AgA

1

使用:printf関数はNULLで終了する文字列の最後の文字を必要とするため

conbuf.buffer = (char *)calloc( (buffersize * sizeof(char))+1,1); 

が、これはそれを保証します。しかし、ネットワークから受信したデータにはすでにNULが含まれている可能性があります。だからではなく、printf関数を使用してのあなたはfwriteの使用する必要があります。

fwrite(conbuf.buffer,buffersize , STDOUT); 

は、私はそれをファイルにリダイレクトし、出力を確認するために進ダンプを行うには、あなたをお勧めしたいです。

+0

ありがとうAgA!テスト1ではconbuf.bufferはnullですが、テスト2ではreceivebytesのbufはnullではありません。だから私はそれが間違ったポインタのどこかに起因するのだろうか?私のメモリ割り当ては正しいですか?あなたが言及したものに変更しました。 – swap

+1

コードを書かない限り、私はあなたの声明が混乱しているのでコメントできません。すべてのメモリが使い果たされていない限り、callocはnullを返しません。配列を宣言するためには、ほとんどのC++実装ではサイズがコストになるはずなので、バッファのサイズはconst intとして宣言する必要があります。 – AgA

関連する問題