如何分配内存C.

时间:2015-03-28 14:26:54

标签: c arrays memory multidimensional-array

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

让我们说用户输入x=5以及当我这样做时

matrix [1][6] = 1 

我希望它能够做到这一点

matrix [2][0] = 1

任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

我可以建议采用略有不同的方法:

分配一个1维数据结构,将数据保存在" line"中。然后编写一个线性化这些坐标的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;

答案 1 :(得分:0)

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

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]可以加入元素。

2D数组是指向行开头的指针数组,所有项目都是通过一次调用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,&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.添加了释放内存的功能。