我正在ubuntu 16上使用gcc编译器,当我打印显示值垃圾值时显示
#include <bits/stdc++.h>
int Arrayprint(int r, int l, unsigned int* q)
{
r = 3;
l = 4;
for (int i = 0; i < r; i++) {
for (int j = 0; j < l; j++) {
cout << *(q + sizeof(unsigned int) * (i * l + j)); //Garbage getting diplay
cout << *(q + i + j); //this working
cout << "\t";
}
}
cout << "size of unsigned int : " << sizeof(unsigned int); //4
cout << "size of int : " << sizeof(int); //4
}
int main()
{
unsigned int image[R][L] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 } };
unsigned int* q = (unsigned int*)image;
Arrayprint(R, L, q);
}
答案 0 :(得分:1)
据我所知,您从较低的层次上了解到i
数组的第T
个元素的地址为base + sizeof(T) * i
。没错,知道这一点很好。
但是,C和C ++已经为您解决了这个问题。当您说q + i
或q[i]
时,实际上是将其编译为q + sizeof(T)*i
(后者也会取消引用结果)。
因此,当您说q[sizeof(int)*i]
时,实际上是在编译成*(q + sizeof(int)*sizeof(int)*i)
,这显然不是您想要的。
因此,您实际访问的数组中的索引偏离了sizeof(int)
,并导致越界错误,这是您的奇数来自何处。
答案 1 :(得分:0)
当我打印值时,我在ubuntu 16上使用gcc编译器 垃圾值正在显示
与其尝试解决原始数组的杂项损坏问题,不如考虑使用标准容器:
#include <iostream>
#include <array>
constexpr size_t R = 3;
constexpr size_t L = 4;
using image_t = std::array<std::array<unsigned int, L>, R>;
void Arrayprint(const image_t& q) {
// range based for loops for convenience
for(auto& row : q) { // get references to each row
for(unsigned int colval : row) { // get the column values
std::cout << colval << "\t"; // print the values
}
std::cout << "\n";
}
}
int main() {
image_t image = {{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}};
Arrayprint(image);
}
输出:
1 2 3 4
5 6 7 8
9 10 11 12