c++ - 在指针中列出元素时出现问题

标签 c++ pointers for-loop dynamic-memory-allocation

我正在开发一个 C++ 程序,用户可以在其中将电话号码添加到列表中。对于此分配,我们必须在动态分配所需内存的同时使用指针。下面的代码工作正常,除了当程序列出指针中的元素时,会吐出随机数。我是 C++ 的新手,所以非常感谢任何可以指出解决此问题的正确方向的方法。

int *FirstArray = new int(size);
int *SecondArray = new int(size + 1);
if (size == 0) {
    cout << "Please enter the number which you would like to add";
    cin >> FirstArray[size];
    for (int x = 0; x <= size; x++) {
        cout << x << ". " << FirstArray[x] << endl;
    }
    for (int x = 0; x <= size; x++) {
        FirstArray[x] = SecondArray[x];
    }
    SecondArray = FirstArray;
    delete (FirstArray);
}
else {
    cout << "Please enter the number which you would like to add";
    cin >> SecondArray[size];
    for (int x = 0; x <= size; x++) {
        cout << x + 1 << ". " << SecondArray[x] << endl;
    }
}
size++;

最佳答案

除了 std::vector 确实是此类应用程序的更好选择这一事实之外,我认为学习指针是理解为什么使用 std-container 更好的一个很好的起点。

您的代码片段中的整个 if(size==0) block 以及 else 作用域都不安全,因为 FirstArray[x] 从内存中读取至少每个 x > 0 都没有分配的内存。 所谓segmentation faults在这种情况下很可能会出现这种情况,尽管在调试器友好的内存布局或其他原因的情况下可能会推迟这种情况。

除此之外,您实际上并没有真正的列表,而只有两个单元素数组(或指针)引用的两个值,这很清楚为什么您只能从指针指向的内存中获取随机数。 C(或 C++)中的指针不限制对第一个元素后面的后续元素的访问。 这意味着,指针可以用于单个值(这与 size == 1 的数组完全相同)和具有多个元素的数组。 还有一些问题...

  1. 使用 new int[] 而不是 new int() 因为在这种情况下,圆括号 () 被理解为编译器生成的数据类型为“int”的“构造函数”的参数列表,在 int() 的情况下只是设置值(value)。因此,C++ 也将其类型范例应用于基本类型,而不仅仅是类。参见 another SO article on this topic 使用 new int[size] 代替你想要的。它为具有“大小”元素的整数数组分配内存,并返回指向第一个元素的指针。
  2. 我认为您不需要 SecondArray。像“SecondArray = FirstArray”这样的语句无论如何都不会复制元素。它正在复制指针并将分配给 SecondArray 的内存留作内存泄漏。
  3. 使用“delete (FirstArray)”删除 FirstArray 会使情况变得更糟,因为您同时删除了 FirstArray 和 SecondArray,因为它们都指向相同的内存位置,并且对 SecondArray 的任何进一步访问都是危险的(段错误等)<
  4. 最后增加 size++ 也是徒劳的(如果我的想法正确的话),因为在分配和访问内存之前应该清楚大小,而不是之后。
  5. 调整数组大小以防“大小”发生变化,这可以通过调用 new(FirstArray)[size](很少直接使用但在标准容器中很常见)或因此放弃使用 C++ 并切换到ANSI C 风格,malloc() 用于初始分配,realloc() 用于调整大小,memcpy() 用于复制/分配,最后是 free() 用于释放。但是在这种情况下切换到 ANSI C 风格并不意味着您不能在 C++ 上下文中使用它。顺便说一句,在大多数标准 C++ 框架中,new-operator 和 delete-operator 在幕后调用 malloc() 和 free()。

在一天结束时,使用 std::vector<>可以让生活更轻松 ;-)

关于c++ - 在指针中列出元素时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43001934/

相关文章:

c++ - 如何在不重新编码的情况下剪切 MP3?我应该只复制框架吗?

c - 尝试将唯一的单词读入文件,但内存分配出现问题

c++ - 如何删除尚未分配给对象的指针

python - 类型错误 : 'numpy.ndarray' object is not callable within for loop Python

java - 是否可以在运行时更改此 java 代码以插入一些小代码

c++ - 使用/clr 选项编译 C 代码

c++ - 创建进程间共享的全局命名计数器

c++ - 从 C++ 中的空基类继承

c - 如何将 C 字符串中的计数器变量赋予函数

c++ - 'for loop' 的终止条件是否在 VC++ 6 中刷新?