我需要分配int matrix[x][x]
字段,x
是用户输入,我希望这些行是一个连续的内存块。
让我们说用户输入x=5
以及当我这样做时
matrix [1][6] = 1
我希望它能够做到这一点
matrix [2][0] = 1
任何人都可以帮我这个吗?
答案 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]=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);
测试代码:
#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.添加了释放内存的功能。