微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用单个指针在C / C ++中显示2D数组

如何解决如何使用单个指针在C / C ++中显示2D数组

我已经搜索了,但是找不到合适的解决方案。 代码通过将数组的大小作为参数在函数生成2D数组。 现在在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;
}

解决方法

与C ++相比,这更像C,但是:

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

使用第一种方法,您将获得连续的内存空间,而使用第二种方法,您将获得不连续的内存空间。

,

您可能会在此之后吗?

#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()不太好)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。