繁体   English   中英

如何分配内存C

[英]How to allocate memory C

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

可以说用户输入x=5 ,当我这样做时

matrix [1][6] = 1 

我希望它这样做

matrix [2][0] = 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;

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

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]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调用char** array2d;alloc2d(42,&array2d);

测试代码:

#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。添加了释放内存的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM