【问题标题】:C++: How to allocate and fill dynamic array of a struct passed by reference?C ++:如何分配和填充通过引用传递的结构的动态数组?
【发布时间】:2018-09-26 15:42:47
【问题描述】:

我有一个非常简单的结构,可以将size 字段添加到动态数组中:

template <typename T>
struct sized_array {
    int size;
    T* array;
};

我不能使用std::vectorstd::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_joinarray_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


【解决方案1】:

当打印出来时,数组似乎被随机的 ASCII 字符填充

这是因为您的 array_join 函数中有错误:

text += array.array[i];

这将附加一个int,重新解释为char不是数字的十进制表示。

使用std::to_string 解决问题:

text += std::to_string(array.array[i]);

如果您受限于 C++11 之前的 C++ 版本,请改用 std::stringstream

【讨论】:

  • 感谢您的回答!知道为什么数组元素在调试器中不可见,并且只显示第一个吗?
  • @WearyAdventurer 调试器不知道它是一个数组,它将指针类型的变量视为指向单个项目的指针。
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多