这是我的代码。我的目的是在运行时将内存分配给2D数组,不超过输入中给定的大小。
为什么会出现分段故障 ?这是因为数组元素必须连续存储和malloc(动态分配)不让这种情况发生吗?或我在写这段代码时犯了一些错误。请带我过去。提前谢谢。
int main(){
// STEP 1
int size,**arr,i=0,j=0;
printf("Enter the size of matrix : ");
scanf("%d",&size);
// STEP 2
arr = (int**)malloc(size*size*sizeof(int));
printf("n Enter the %d elements : n",size*size);
for(i=0;i<size;i++){
for(j=0;j<size;j++){
// STEP 3
scanf("%d",&arr[i][j]);
}
}
/*
for(i=0;i<size;i++){
for(j=0;j<size;j++){
printf("%dn",matrix[i][j]);
}
}
*/
return 0;
}
这是个典型的错误。
指向指针的指针实际上与二维数组不同。
当然,您可以通过var[x][y]
语法访问两者的元素,但是
int foo[x][y]
不同于
int **bar
如果你真的想要这种动态,你必须为指针列表分配空间,然后依次为每个指针分配元素空间。
bar = malloc( x * sizeof(int*) );
for ( int i = 0 ; i < x ; i++ )
bar[i] = malloc( y * sizeof(int) );
如果可能的话,您应该尽量避免使用实际的二维数组,在C99中,您可以在堆栈上声明二维数组,即使它的大小是在运行时确定的:
int main()
{
int n;
scanf("%d", &n);
int array[n][n];
// ...
return 0;
}
你应该这样分配:
arr = malloc(size * sizeof(int*));
for (int i = 0; i <size; i++)
arr[i] = malloc(size * sizeof(int));
不要忘记使用free
释放内存。
旁注:不强制转换malloc
的返回值。
一种有效的方法,也可以让你摆脱由双指针级别分配引起的内存碎片,使你的矩阵线性:
arr = (int*) malloc (size*size*sizeof(int));
然后用arr[i*size + j]代替arr[i][j]:
像这样使用它:一个动态内存分配的完美例子
void mxmult()
{
int n,m,a,b,c,d, sum=0;
int x,y,z;
printf("Enter first order [n*n]n");
scanf("%d", &n);
printf("Enter second order [m*m]n");
scanf("%d", &m);
if (n!=m)
{
printf("Invalid orders");
}
else
{
//mem allocate for matrix 1
int **mat1 = (int**)malloc(n*sizeof(int));
for(x=0;x<n;x++)
{
mat1[x]=(int*)malloc(n*sizeof(int));
}
// input matrix 1
printf("Enter the first matrix entriesn");
for (a = 0; a <n; a++)
{
for (b = 0; b < n; b++)
{
scanf("%d", &mat1[a][b]);
}
}
// memory allocate matrix 2
int **mat2 = (int**)malloc(m*sizeof(int));
for(y=0;y<n;y++)
{
mat2[y]=(int*)malloc(m*sizeof(int));
}
//inpur matrix 2
printf("Enter the second matrix entriesn");
for (c = 0; c <n; c++)
{
for (d= 0; d < n; d++)
{
scanf("%d", &mat2[c][d]);
}
}
//Memory allocate matrix Mult
int **mult=(int**)malloc(m*sizeof(int));
for(z=0;z<m;z++)
mult[z]=(int*)malloc(m*sizeof(int));
for (a = 0; a < n; a++)
{
for (d = 0; d < m; d++)
{
for (c = 0; c < n; c++)
{
sum=sum + (mat1[a][c] *mat2[c][d]);
}
mult[a][d] = sum;
sum= 0;
}
}
printf("Productn");
for ( a = 0 ; a < n ; a++ )
{
for ( d = 0 ; d < m ; d++)
printf("%dt", mult[a][d]);
printf("n");
}
}
}