[英]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]=42
或array2d[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.