【发布时间】:2019-06-20 10:11:56
【问题描述】:
#include <iostream>
using std::cout;
using std::cin;
void printArray(int A[], int size) {
for(int i = 0; i < size; i++) {
cout << A[i] << "\t";
}
cout << "\n";
}
struct Array {
int *A;
int size;
int length;
};
void display(Array *arr) {
for(int i = 0; i < arr->length; i++) {
cout << arr->A[i] << "\t";
}
cout << "\n";
}
void fillArray(Array *arr) {
for(int i = 0; i < arr->length; i++) {
cin >> arr->A[i];
}
}
void add(Array *arr, int x) {
if(arr->length < arr->size) {
arr->A[++arr->length] = x;
}
}
int main() {
Array arr;
cout << "arr.size before initializing: " << arr.size << "\n"; // gives a garbage value
cout << "Enter the size of the array: ";
cin >> arr.size;
cout << "Output of arr variable &arr: " << &arr << "\n";
arr.A = new int[arr.size];
cout << "arr.length before initializing: " << arr.length << "\n"; // gives garbage value
cout << "How many elements do you want to enter: ";
cin >> arr.length;
fillArray(&arr); //This is not pass by value but pass by reference because
display(&arr); // this function displays the values of arr
add(&arr, 15);
cout << "The length of the array after adding: " << arr.length << "\n";
display(&arr);
printArray(arr.A, arr.length);
}
这个程序的输出是这样的:
$ ./array_adt
arr.size before initializing: -140717888
Enter the size of the array: 10
Output of arr variable &arr: 0x7ffe4e0ec040
arr.length before initializing: 21932
How many elements do you want to enter: 5
4 6 7 3 2
4 6 7 3 2
The length of the array after adding: 6
4 6 7 3 2 0
4 6 7 3 2 0
我很困惑为什么不将元素 15 添加到结构的数组中(这实际上是一个指针,它被初始化为堆中的数组)。如果有人能阐明这一点,那对很多人以及深入理解 C++ 概念都会非常有用。
非常感谢。
【问题讨论】:
-
格式良好的程序不允许读取未初始化变量的值。这样做就是使程序的行为未定义。这意味着编译器可以做各种你在翻译代码时不想做的事情。删除所有打印未初始化变量的行,即使没有引起问题,它们也会产生错误的代码。
-
你的意思是我打印数组的所有行?即函数
display和printArray? -
我的意思是“初始化之前的 arr.size” - 你在这里读到 arr.size 时它仍然有一个不确定的值。 C++ 标准不允许这样做,原因是未定义的行为。
-
我只是在艰难地学习 C++ 而已:) 哈哈。