2012-03-20 83 views
-1

我想將字節接收到conbuf.buffer中。測試1或測試2都可以。我在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:你可以發佈一些實際編譯的代碼嗎? – 2012-03-20 17:38:10

+0

什麼確切的數據通過套接字發送? – Mark 2012-03-20 17:39:08

+2

使用'std :: vector'代替手動內存分配。 – 2012-03-20 17:39:57

回答

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 2012-03-20 17:40:28

+0

sizeof(char *)總是大於等於sizeof(char)。 – AgA 2012-03-20 17:45:16

1

使用此:

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

因爲printf的需要串的最後一個字符爲空終止,這保證了它。但是從網絡收到的數據可能已經包含NUL。因此,而不是用printf的你應該使用FWRITE:

fwrite(conbuf.buffer,buffersize , STDOUT); 

我建議你把它重定向到文件,做一個十六進制轉儲查看輸出。

+0

謝謝AgA!但在測試1中,conbuf.buffer爲null,而在測試2中,receivebytes中的buf不爲null。所以我想知道是否由於不正確的指針在某處?我的內存分配是否正確?我把它改爲你提到的那個.. – swap 2012-03-20 17:59:03

+1

除非你給代碼我不能評論,因爲你的陳述很混亂。除非所有內存都耗盡,否則calloc將永遠不會返回null。另外buffersize應該聲明爲const int,因爲在大多數C++實現中聲明數組的大小應該是成本的。 – AgA 2012-03-20 18:08:40