【问题标题】:How to allocate memory C如何分配内存 C
【发布时间】:2015-03-28 14:26:53
【问题描述】:

我需要分配int matrix[x][x] 字段,x 是用户输入,我希望这些行是一个连续的内存块。

假设用户输入x=5,当我这样做时

matrix [1][6] = 1 

我希望它这样做

matrix [2][0] = 1

任何人都可以帮助我吗?

【问题讨论】:

  • 你的最终目标是什么?
  • 我有一个文本文件,其中的矩阵像 00101\n01011\n01011\n01011\n01010\n 我需要将它加载到矩阵 [5][5] 用户首先将矩阵写入文本文件然后运行程序并输入行数
  • 你想用“0”分配还是动态分配一个数组?你有点让我迷失了 matrix[2][0]=1 部分..
  • 在分配matrix 时需要帮助吗?你真的需要你描述的那种索引吗?
  • 只是你想让它换行(因为 6 否则会超出该数组的末尾)?

标签: c arrays memory multidimensional-array


【解决方案1】:

我可以建议一种稍微不同的方法吗:

分配一个将数据保存在“行”中的一维数据结构。然后编写一个将这些坐标线性化的 get 函数。

class linearMatrix{
    int dim;
    int* memory;

public:
    linearMatrix(int d) : dim(d) {
        memory = (int*) malloc(dim*dim*sizeof(int));
        // insert code to fill the matrix
    }

    int get(int x, int y){
        int index = x*dim + y;
        return memory[index];
    }

    void set(int x, int y, int value){
        int index = x*dim + y;
        memory[index] = value;
    }

    ~linearMatrix(){
        free(memory);
    }
};

内存将始终以这种方式连续,如果坐标真的没问题,它允许插入一些检查。当然,您必须从矩阵字符串中删除所有 \n 字符,以便数组中只有原始数字。

linearMatrix 会像这样使用:

linearMatrix matrix(5);
// make sure the matrix gets filled somehow
// these 2 calls access the same memory location
matrix.set(1,6) = 1;
matrix.set(2,1) = 1;

【讨论】:

    【解决方案2】:

    我建议使用以下方式分配数组,以使所有元素在内存中连续:

    int n;
    char** array2d=malloc(n*sizeof(char*));
    if(array2d==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
    array2d[0]=malloc(n*n*sizeof(char));
    if(array2d[0]==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
    int i;
    for (i = 1 ; i < n ; i++)
    {
        array2d[i] =& array2d[0][i*n];
    }
    

    元素可以通过array2d[i][j] 加入。

    二维数组是一个指向行首的指针数组,所有项目都通过对malloc()的一次调用来分配。

    如果数据由 fftw 或 lapack 等库处理,这种分配内存的方式很有用。指向数据的指针是array[0]

    确实,写array2d[0][n]=42array2d[1][0]=42 执行相同的操作!

    见:

    在函数中:

    int alloc2d(int n,char ***array2d){
        *array2d=malloc(n*sizeof(char*));
        if(*array2d==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
        (*array2d)[0]=malloc(n*n*sizeof(char));
        if((*array2d)[0]==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
        int i;
        for (i = 1 ; i < n ; i++)
        {
            (*array2d)[i] =& (*array2d)[0][i*n];
        }
        return 0;
    }
    

    char** array2d;alloc2d(42,&amp;array2d);从main调用

    测试代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int alloc2d(int n,char ***array2d){
        *array2d=malloc(n*sizeof(char*));
        if(*array2d==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
        (*array2d)[0]=malloc(n*n*sizeof(char));
        if((*array2d)[0]==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
        int i;
        for (i = 1 ; i < n ; i++)
        {
            (*array2d)[i] =& (*array2d)[0][i*n];
        }
    }
    
    int free2d(char **array2d){
        free(array2d[0]);
        free(array2d);
        return 0;
    }
    
    int main()
    {
        int n=42;
        char** array2d;
        alloc2d(n,&array2d);
    
        array2d[0][n]=13;
        printf("%d\n",array2d[1][0]);
        free2d(array2d);
        return 0;
    }
    

    gcc main.c -o main 编译。正如预期的那样,输出为 13。添加了释放内存的函数。

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多