在C ++中动态分配类中的字符数组

时间:2016-02-04 10:55:42

标签: c++ arrays

我正在尝试创建自己的字符串类,并且我正在尝试创建构造函数。到目前为止,我有点挣扎。

我在头文件中定义了我的函数原型,并在头文件中定义了变量缓冲区,如char *buffer;,在一个新的cpp文件中,我试图像这样定义构造函数:

mystring::mystring(const char *s)
{
    int counter = strlen(s)+1;
    *buffer = generate_c_array(counter);
}

char * mystring::generate_c_array(int size)
{
  return new char[size];
}

我基本上试图使buffer是一个大小为s+1的char数组,并包含s后跟空终止符的内容。但是,这导致我的程序崩溃。

我不确定如何正确分配缓冲区,这看起来是否正确?

4 个答案:

答案 0 :(得分:2)

您可以简单地编写代码

mystring::mystring(const char *s)
{
    sz = strlen(s) // sz- another data member, holds size
    buffer = new char[sz + 1];
    strcpy(buffer, s); // assuming s is null-terminated
}

for循环和计数器实际上不是必需的

答案 1 :(得分:1)

您已分配给buffer中的特定字符,而不是变量buffer。改为:

buffer = generate_c_array(counter);

除此之外,strdup将为您执行相同的工作,但您必须使用free()取消分配。在当前的代码中,您实际上并没有真正复制,除非使用前面提到的strcpy(buffer, s),否则您必须执行strdup

答案 2 :(得分:0)

为什么要循环遍历字符串std::size_t length = strlen(s); buffer = generate_c_array(length + 1); // Copy your string: memcpy(buffer, s, length) // Add the terminator character: buffer[length] = '\0'; 的长度?

如果您需要字符串的长度,请直接使用它:

https://github.com/socketio/engine.io 
transports (<Array> String): transports to allow connections to (['polling', 'websocket'])

答案 3 :(得分:0)

  1. 您尚未复制内容..
  2. 如果要为另一个指针指定一个指针(new给你的指针),则不需要*
  3. strncpy为您复制。
  4. mystring::mystring(const char *s)
    {
        int counter = strlen(s)+1;
        char* buffer = generate_c_array(counter);
        strncpy(buffer, s, counter);
    }
    
    char * mystring::generate_c_array(int size)
    {
      return new char[size];
    }