这是我的代码。我的目的是在运行时将内存分配给 2D 数组,直到输入中给出的任何大小。
为什么分段错误发生?是因为数组元素必须连续存储而 malloc (动态分配)是不是要让这种情况发生? OR 我在编写此代码时遇到了一些错误。请指导我。 提前谢谢。
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("%d\n",matrix[i][j]);
}
}
*/
return 0;
}
答案 0 :(得分:3)
这是一个经典错误。
指向指针的指针实际上与二维数组不同。
当然,您可以通过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;
}
答案 1 :(得分:2)
您应该像这样分配:
arr = malloc(size * sizeof(int*));
for (int i = 0; i <size; i++)
arr[i] = malloc(size * sizeof(int));
不要忘记使用free
释放记忆。
旁注:不要转换malloc
的返回值。
答案 2 :(得分:1)
一个可行的想法,也可以让你摆脱这个双指针级别分配引起的内存碎片,使你的矩阵成为线性的:
arr = (int*) malloc (size*size*sizeof(int));
然后只需使用arr [i * size + j]而不是arr [i] [j]访问您的元素:
答案 3 :(得分:0)
像这样使用它:动态内存分配的完美示例
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 entries\n");
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 entries\n");
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("Product\n");
for ( a = 0 ; a < n ; a++ )
{
for ( d = 0 ; d < m ; d++)
printf("%d\t", mult[a][d]);
printf("\n");
}
}
}