使用行顺序在打印二维数组上显示垃圾值

时间:2019-04-16 18:23:57

标签: c++

我正在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);
}

2 个答案:

答案 0 :(得分:1)

据我所知,您从较低的层次上了解到i数组的第T个元素的地址为base + sizeof(T) * i。没错,知道这一点很好。

但是,C和C ++已经为您解决了这个问题。当您说q + iq[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