当前位置: 首页 > 知识库问答 >
问题:

动态调整数组代码在C++中不能工作?

红朝
2023-03-14

我正在尝试创建一个数组,每次它被完全填满时它就会翻倍。

#include <iostream>
using namespace std;

int* array_doubler(int* array, int size){
    int *new_array = new int[size*2];

    for(int i = 0; i < size; i++){
        new_array[i] = array[i];
    }

    delete[] array;
    return new_array;
}


int main()
{
    int N = 10; // Size of array to be created
    int *array = new int[0];

    for(int i = 0; i < N; i++)
    {
        if(array[i] == '\0')
            array = array_doubler(array, i);
        array[i] = i*2;
    }

    //Printing array elemensts
    for(int i = 0; i < N; i++)
        cout << array[i] << '\t';

    cout << '\n';
    return 0;
}

问题是,当我用new创建动态内存时,所有的点都有空字符\0值(不仅仅是最后一个点)。 即如果我写:

int* p = new int[5];

那么内存中的所有5个块P[0],P[1],P[2],P[3],P[4],P[5]中都有\0,而不仅仅是P[5]。 因此,我的main()中的if(array[i]=='\0')for循环的每一次迭代调用array_doubler。 我希望它首先填充数组中的可用点,当它到达最后一个元素时,然后调用array_doubler

共有2个答案

淳于祺
2023-03-14

我不知道您为什么要这样做,因为std::vector提供了这种特性,而且更符合C++的习惯(请参阅isocpp常见问题解答“为什么C样式数组是邪恶的”)。

C样式数组的一个问题是,它们不知道自己的大小,并且它们没有默认值,因此保持未初始化。

如果出于某种原因不需要使用std::vector,那么下一个最佳解决方案是将数组与它的大小包装在一个结构或类中(这是std::vector正在做的事情),或者使用std::memset初始化数组(如果在C语言中,它是您将使用的C函数)。

请记住,这并不被认为是好的实践,当您需要容器时,STL提供了大量的解决方案。

耿炎彬
2023-03-14

问题是,当我用new创建动态内存时,所有的点都有空字符\0值(不仅仅是最后一个点)。

实际上,它们中有未定义的值。 0是它们应该具有的有效值,但是明天编译器可能会突然决定它们都应该具有1而不是0。

如果你想检测一个数组的末尾,那么你就得记住这个数组有多大。 C++并不适合你。 实际上,如果您使用std::vector,它确实可以为您实现这一功能,但我认为这不是本练习的重点。

 类似资料:
  • 本文向大家介绍C#动态调整数组大小的方法,包括了C#动态调整数组大小的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#动态调整数组大小的方法。分享给大家供大家参考。具体如下: 通常,我们创建一个数组后就不能调整其长度,但是Array类提供了一个静态方法CreateInstance用来创建一个动态数组,所以我们可以通过它来动态调整数组的长度。 希望本文所述对大家的C#程序设计有所帮助

  • 我试图创建一个重载函数,该函数将用对象的动态类型调用。我尽量做到这一点,而不干扰下面的实际类结构,因为我没有直接访问权限(即我无法添加虚拟方法等) 作为一个具体的例子,让我们考虑一个AST类结构,它看起来有点像这样: 我想编写一个函数act,它将ASTNode的一个实例作为参数,并根据其实际的动态类型执行不同的操作。电话是这样的 然后,我想根据ASTNode的动态类型采取行动。 但目前我无法调用,

  • 主要内容:ArrayList 类中的属性,ArrayList 类中的方法在 C# 中,动态数组(ArrayList)代表了可被单独索引的对象的有序集合。动态数组基本上可以代替数组,唯一与数组不同的是,动态数组可以使用索引在指定的位置添加和移除指定的项目,动态数组会自动重新调整自身的大小。另外,动态数组允许在列表中进行动态内存分配、增加、搜索、排序等操作。 ArrayList 类中的属性 在 C# 中想要创建动态数组需要使用 ArrayList 类,下表中列出了 Arr

  • 本文向大家介绍C语言完美实现动态数组代码分享,包括了C语言完美实现动态数组代码分享的使用技巧和注意事项,需要的朋友参考一下 我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量。 这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源。 请实现一个简单的动态数组,能够随时改变大小,不会溢出,也不会浪费内存空间。 下面的代码实现了简单的动态数组: 运行结果:

  • 如何动态调整列的大小以支持可能的不规则数组? 上面的代码会分配每个col的长度吗? 事先谢谢你的帮助。

  • 我正在努力设置一个组合框(在 Excel VBA 中),以便根据它包含的最长字符串的长度自动调整其宽度。 我正在尝试创建一个下拉列表(使用名为“WorksheetSelectionForm”的表单中的组合框),一旦打开特定工作簿,该列表就会出现在屏幕上,并允许用户选择要打开的工作簿工作表中的哪一个。 我希望组合框的宽度调整为下拉列表中最长文本字符串的长度。目前,我的下拉列表包含三个项目(工作簿中当

  • 我有以下Sikuli代码在JMeter这是不工作。 我尝试了Beanshell采样器和JSR223采样器,但在这两种情况下都不起作用。这是我得到的错误。 JSR223采样器 响应消息:javax。剧本脚本异常:javax。剧本ScriptException:FindFailed:C:\scripts\patterns\vnc\vncviewer。png:(32x31)在R[0,0 1920x108

  • 问题内容: 我有一个C函数,我想从C 调用。我无法使用“ ”这样的方法,因为C函数无法使用g 进行编译。但是使用gcc可以很好地编译。有什么想法如何从C ++调用函数吗? 问题答案: 像这样编译C代码: 然后是这样的C ++代码: 然后使用C ++链接器将它们链接在一起: 当您包含C函数的声明时,还必须告诉C ++编译器C头即将到来。因此开始于: 应该包含以下内容: (在此示例中,我使用了gcc,