【问题标题】:How to display an 2D array in C/C++ using a single pointer如何使用单个指针在 C/C++ 中显示二维数组
【发布时间】:2021-01-27 13:33:40
【问题描述】:

我已搜索但找不到合适的解决方案。 该代码通过将数组的大小作为参数在函数中生成二维数组。 现在在 main() 函数中,我希望打印数组。但是输出不正确。 这就是我目前所得到的。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int * generate(int size){
    int i, j;
    // allocate  memory
    static int **X = (int **)malloc(size * sizeof(int *)); 
    for(i=0; i<size;i++)
        X[i]=(int *)malloc(size * sizeof(int));
    
    for(i=0; i<size;i++)
        for(j=0;j<size;j++)
            X[i][j]=rand()%1000;
    
    return *X;
}

int main(){

    srand(time(NULL));
    int size=3;
    int *p=generate(size);
    
    for(int i=0; i<size; i++){
        for(int j=0; j<size;j++){
            printf("%5d ",(*(p+i)+j));
        }
        printf("\n");
    }
    return 0;
}

【问题讨论】:

  • 没有有一个二维数组。您有一个指向其他一维数组的指针的一维数组,它们不连续。
  • 如果我删除 static: ideone.com/P7qU4o 对我有用
  • 那么这里可以做些什么改变,这样如果我得到位置 A[0][0],就可以使用 *(*(p+i)+j) 打印元素
  • 请解释“输出不正确”。究竟是什么不正确?显示实际输出,并显示预期输出。
  • 例如示例输出:[20 21 22] [10 11 12] [30 31 32] 所以下一列中的值只是增加了 1

标签: c++ arrays c pointers


【解决方案1】:

这更像是 C 和 C++,但是:

在生成中使用malloc(size*size*sizeof(int)) 或将generate 更改为返回int** 而不是int*。 (在您的情况下生成返回 *X,并且您只得到第一行)。

第一种方法可以获得连续的内存空间,第二种方法不是(数组数组)。

【讨论】:

    【解决方案2】:

    你可能会在这之后?

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    int** generate(int size) {
        int i, j;
     
        int ** X = (int **) malloc(sizeof(int*) * size );
    
        for (i = 0; i < size; i++)
           X[i] = (int*) malloc(sizeof(int) * size);
    
        for (i = 0; i < size; i++)
        {
            for (j = 0; j < size; j++)
            {
                X[i][j] = rand() % 1000;
                printf("%5d", X[i][j]);
            }
            printf("\n");
    
        }
        return X;
    }
    
    int main() {
    
        srand(time(NULL));
        int size = 3;
        int** p = generate(size);
    
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                printf("%5d ", p[i][j]);
            }
            printf("\n");
        }
    
        //DONT FORGET TO FREE
        for (int i = 0; i < size; i++)
        {
          int* currentp = p[i];
          free(currentp);
         }
        return 0;
    }
    

    如果您想使用 j + i 浏览元素,我认为您需要重新考虑如何阅读索引。例如,如果您阅读 **(p+i) ,您将获得每行的第一个元素,但我不确定您是否知道如何为其余部分分配内存(我不确定这是否便于查找对于 j+i 的元素)。如果您想这样做,我怀疑您需要将数组全部分配为 size*size 以确保索引的连续性...

    (上面的代码和后面的注释基本都是StPiere提出的观点)

    另外,作为建议检查this post(关于为什么在 C++ 中使用 malloc()/free() 不是很好)

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 2017-04-26
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2016-05-08
      • 2010-12-18
      • 2012-12-30
      • 1970-01-01
      相关资源
      最近更新 更多