确定动态内存分配中char指针的最大容量

时间:2016-03-30 17:02:14

标签: c++ arrays string pointers sizeof

首先,我想要清楚的是,这是我过去的家庭作业,但我无法理解,而且我仍然试图绕过头脑。这些是辅助构造函数的说明:

NIUString :: NIUString(const char * other)

  

NIUString类的构造函数应该将新的NIUString对象初始化为C字符串other。所需的逻辑是:
  将新对象的字符串大小设置为C字符串other的长度   将新对象的字符串容量设置为字符串大小   如果字符串容量为0,则将新对象的字符串数组指针设置为nullptr。否则,使用字符串数组指针为新对象分配char数组。新字符串数组中的元素数应等于字符串容量   将C字符串other的字符(最多但不包括空字符)复制到字符串数组中。

对于我的输出我应该得到

  

测试第二个构造函数
  s2:一些文字
  s2尺寸:9
  s2容量: 9
  s2不为空

但我得到......

  

测试第二个构造函数
  s2:一些文字
  s2尺寸:9
  s2容量: 8
  s2不为空

经过研究后,我了解到这是因为你不能在指针上使用sizeof,因为它只会给你内存中指针的大小,而不是字符串容量的实际大小。 / p>

这是我编写的方法的代码

//secondary constructor
NIUString::NIUString( const char* other)
{
    Capacity = sizeof(other);
    Size = strlen(other);

    if (Capacity == 0)
    {
        arrayPoint = nullptr;
    }
    else
        arrayPoint = new char[Capacity];
    strcpy(arrayPoint, other);

}

无论如何,我的问题是:这可以做到的方式是什么?我一直在研究这个问题,但是没有找到一个类似于我的任何一个例子。如果有人能指导我正确的方向,那将是非常有用的。

这是我用来测试我的方法/类的代码;其他一切正常,除了数组的容量。

NIUString s2 = "some text";

cout << "s2: " << s2 << endl;
cout << "s2 size: " << s2.size() << endl;
cout << "s2 capacity: " << s2.capacity() << endl;
cout << "s2 is " << ((s2.empty()) ? "empty\n" : "not empty\n");
cout << endl <<endl << endl;

4 个答案:

答案 0 :(得分:2)

试试这个,做你想做的事:

1)自动填充容量

2)容量&gt;大小

但是其他参数绝对不能使用new分配:

template <int _size>
NIUString::NIUString( const char (&other)[_size])
{
    Capacity = _size;
    Size = strlen(other);

    if (Capacity == 0)
    {
        arrayPoint = nullptr;
    }
    else
    {
        arrayPoint = new char[Capacity];
        strcpy(arrayPoint, other);
    }
}

void main()
{
    char aux[20];// this works
    strcpy(aux, "test");
    NIUString niu(aux);
}

答案 1 :(得分:0)

好的,如果你有权访问原始指针变量(必须是静态的),那么sizeof只能起作用。通常你会使用c ++类,而不必考虑它。

我认为他们想要这段代码:

NIUString::NIUString( const char* other)
{
    Size = strlen(other);

    if (Capacity == 0)
    {
        arrayPoint = nullptr;
    }
    if (Capacity <= Size + 1)
    {
        Capacity = Size + 1;
    }
    arrayPoint = new char[Capacity];
    strcpy(arrayPoint, other);

}

答案 2 :(得分:0)

&#34;将新对象的字符串容量设置为字符串大小。&#34;

这是在

之后完成的

&#34;将新对象的字符串大小设置为其他C字符串的长度。&#34;

因此:

  • 字符串大小 = 字符串长度

  • 字符串容量 = 字符串大小

然后:

  • 字符串容量 = 字符串长度

我认为他们要求这样做:

//secondary constructor
NIUString::NIUString( const char* other)
{
    Capacity = Size = strlen(other);

    if (Capacity == 0)
    {
        arrayPoint = nullptr;
    }
    else
         arrayPoint = new char[Capacity];

    strcpy(arrayPoint, other);
}

答案 3 :(得分:0)

由于未指定字符数组的终点(动态分配),因此sizeof将无法执行您想要的操作。