【发布时间】:2018-09-26 15:42:47
【问题描述】:
我有一个非常简单的结构,可以将size 字段添加到动态数组中:
template <typename T>
struct sized_array {
int size;
T* array;
};
我不能使用std::vector 或std::array。填充数组的函数初始化sized_array.array字段并用随机整数填充:
void array_fill(sized_array<int> &array, int size = ARRAY_SIZE) {
array.array = new int[size];
array.size = size;
for (int i = 0; i < size; i++) {
array.array[i] = random_in_range(RANDOM_MIN, RANDOM_MAX);
}
}
其他函数,array_join 和 array_print 打印数组的内容:
string array_join(sized_array<int> &array, string delimiter) {
string text = "";
for (int i = 0; i < array.size; i++) {
text += array.array[i];
if (i < array.size) text += delimiter;
}
return text;
}
void array_print(sized_array<int> &array) {
cout << "array(" << array.size << ") = [";
cout << array_join(array, ", ") << "]" << endl;
}
数组变量是这样声明的,程序运行这段代码:
sized_array<int> number_array;
int main() {
srand(time(NULL));
array_fill(number_array);
array_print(number_array);
system("pause");
return 0;
}
在调试时,数组在第一次初始化时显示该值,然后似乎采用random_in_range 的第一个返回值并且永远不会改变,停留在一个元素 - 第一个返回值。
当打印出来时,数组似乎被随机的 ASCII 字符填充,并且第一个元素永远不会是原来的那个(即使调试器显示它只有一个元素)。
这是什么原因,如何避免这个问题?
【问题讨论】:
-
1) 所有调试器看到的是
T*,并且不知道它是指向单个T的指针,还是指向它们的数组,因此它会显示@987654336 的值@。 2) “打印时,数组似乎被随机的 ASCII 字符填充” 不,不是那样的。如果您实际打印了数组,您会看到。将数组连接成字符串的代码就是这样做的。text += array.array[i]实际上并没有将数字转换为字符串。
标签: c++ arrays pointers pass-by-reference dynamic-memory-allocation