【问题标题】:access a char pointer in a struct C++ and allocate memory访问 struct C++ 中的 char 指针并分配内存
【发布时间】:2012-03-20 17:33:10
【问题描述】:

我想将字节接收到 conbuf.buffer。测试 1 或测试 2 中的任何一个都可以。我在 printf 语句中看不到任何价值。我是否正确传递了指针?如何为结构内的 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:你能发布一些实际编译的代码吗?
  • 通过套接字发送的确切数据是什么?
  • 使用std::vector而不是手动分配内存。
  • @kevin:这是另一个大项目的一部分。我取出了我使用缓冲区的行。接收到的数据是一些字符数组。我必须手动分配内存。

标签: c++ pointers struct char malloc


【解决方案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" 

【讨论】:

  • sizeof(char*) 总是大于等于 sizeof(char)。
【解决方案2】:

使用这个:

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

因为 printf 要求字符串的最后一个字符为空终止,这确保了它。但是从网络接收到的数据可能已经在中间包含了 NUL。因此,您应该使用 fwrite,而不是使用 printf:

fwrite(conbuf.buffer,buffersize , STDOUT);

我建议您将其重定向到一个文件中并进行十六进制转储以查看输出。

【讨论】:

  • 感谢 AgA!但在测试 1 中,conbuf.buffer 为空,而在测试 2 中,receivebytes 中的 buf 不为空。所以我想知道这是否是由于某个地方的指针不正确?我的内存分配是否正确?我把它改成你提到的那个..
  • 除非您给出代码,否则我无法评论,因为您的陈述令人困惑。除非所有内存都用尽,否则 calloc 永远不会返回 null。此外,buffersize 应该声明为 const int,因为在大多数 C++ 实现中,声明数组的大小应该是成本。
猜你喜欢
  • 1970-01-01
  • 2019-01-10
  • 2011-11-26
  • 1970-01-01
  • 2021-12-12
  • 2021-12-14
  • 2021-11-22
  • 2020-12-31
  • 2021-04-15
相关资源
最近更新 更多