2012-03-20 81 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