【发布时间】:2021-10-25 16:14:25
【问题描述】:
我有一个指向动态分配的二维数组的指针,并试图通过取消引用指针来打印数组值。不知何故,一些数组索引显示垃圾值,即使我将它们全部初始化为 1。任何对我做错的洞察力将不胜感激。
int main() {
int (*ptr)[4][4];
int** array;
array = new int*[4];
for (int i = 0; i < 4; i++)
{
array[i] = new int[4];
}
ptr = (int(*)[4][4])(*array);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
array[i][j] = 1;
}
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; ++j)
{
cout<<"Val "<<*ptr[i][j]<<" And index "<<i<<" and "<<j<<endl;
}
}
return 0; }
我的输出:
Val 1 And index 0 and 0
Val 0 And index 0 and 1
Val 1 And index 0 and 2
Val 0 And index 0 and 3
Val 1 And index 1 and 0
Val 0 And index 1 and 1
Val 1 And index 1 and 2
Val 0 And index 1 and 3
Val 543973718 And index 2 and 0
Val 1852383332 And index 2 and 1
Val 10 And index 2 and 2
Val 0 And index 2 and 3
Val 0 And index 3 and 0
Val 0 And index 3 and 1
Val 0 And index 3 and 2
Val 0 And index 3 and 3
【问题讨论】:
-
ptr = (int(*)[4][4])(*array);你觉得这有什么作用? -
你的 C 风格的演员表泄露了它。您将
array分配给ptr,但they are not the same types。 -
Tldr:不要使用 C 数组;不要使用明确的
new;不要使用拥有原始指针;不要使用 C 强制转换。使用std::vector或std::array。 -
我认为它使 ptr 指向数组 [0][0]。 我认为它隐藏了编译器会警告您的错误。
-
它没有。 C 转换隐藏了类型不匹配(基本上它是不兼容的
reinterpret_cast),并且ptr的下一次使用调用未定义行为。
标签: c++ arrays pointers memory data-structures