使用malloc在运行时分配内存时出现分段错误
这是我的密码。我的目的是在运行时将内存分配给2D数组,直到输入中给定的大小为止 分段错误发生的原因是什么?是因为数组元素必须连续存储,并且malloc(动态分配)不允许这种情况发生吗? 或我在编写此代码时出错。请引导我通过。 提前谢谢使用malloc在运行时分配内存时出现分段错误,c,arrays,pointers,malloc,dynamic-memory-allocation,C,Arrays,Pointers,Malloc,Dynamic Memory Allocation,这是我的密码。我的目的是在运行时将内存分配给2D数组,直到输入中给定的大小为止 分段错误发生的原因是什么?是因为数组元素必须连续存储,并且malloc(动态分配)不允许这种情况发生吗? 或我在编写此代码时出错。请引导我通过。 提前谢谢 int main(){ // STEP 1 int size,**arr,i=0,j=0; printf("Enter the size of matrix : "); scanf("%d",&size); // S
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;
}
intmain(){
//第一步
整数大小,**arr,i=0,j=0;
printf(“输入矩阵的大小:”);
scanf(“%d”,大小(&S);
//步骤2
arr=(int**)malloc(size*size*sizeof(int));
printf(“\n输入%d个元素:\n”,大小*大小);
对于(i=0;i你应该这样分配:
arr = malloc(size * sizeof(int*));
for (int i = 0; i <size; i++)
arr[i] = malloc(size * sizeof(int));
arr=malloc(size*sizeof(int*);
对于(int i=0;i您应该这样分配:
arr = malloc(size * sizeof(int*));
for (int i = 0; i <size; i++)
arr[i] = malloc(size * sizeof(int));
arr=malloc(size*sizeof(int*);
对于(inti=0;i这是一个典型的错误
指向指针的指针实际上与二维数组不同
当然,您可以通过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) );
这是一个典型的错误
指向指针的指针实际上与二维数组不同
当然,您可以通过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) );
一个可行的方法是使矩阵线性化,它可以消除这种双指针级别分配导致的内存碎片:
arr = (int*) malloc (size*size*sizeof(int));
然后简单地用arr[i*size+j]而不是arr[i][j]访问元素:一个可行的方法,也可以消除这种双指针级别分配导致的内存碎片,就是使矩阵线性化:
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 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");
}
}
}
void mxmult()
{
int n,m,a,b,c,d,和=0;
int x,y,z;
printf(“输入第一个订单[n*n]\n”);
scanf(“%d”和“&n”);
printf(“输入第二顺序[m*m]\n”);
scanf(“%d”、&m);
如果(n!=m)
{
printf(“无效订单”);
}
其他的
{
//为矩阵1分配内存
int**mat1=(int**)malloc(n*sizeof(int));
对于(x=0;x如下所示:动态内存分配的完美示例
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");
}
}
}
void mxmult()
{
int n,m,a,b,c,d,和=0;
int x,y,z;
printf(“输入第一个订单[n*n]\n”);
scanf(“%d”和“&n”);
printf(“输入第二顺序[m*m]\n”);
scanf(“%d”、&m);
如果(n!=m)
{
printf(“无效订单”);
}
其他的
{
//为矩阵1分配内存
int**mat1=(int**)malloc(n*sizeof(int));
对于(x=0;x您是否尝试过使用1D数组?int**
指的是指向int
的指针,而您似乎试图将其用作int
的二维矩阵。您尝试过使用1D数组吗?int**
指的是指向int
的指针,而您似乎正在尝试使用它将其转换为int
sNo的二维矩阵。这将导致内存碎片。@MilesRout;那么您将如何创建二维数组?@MilesRout内存碎片与问题无关。在一些用例中,这是一种好方法,碎片不成问题。@MilesRout但不在这个问题中。有在C中有很多方法可以实现2D数组,但没有一种方法比另一种更好。它们只是有不同的折衷。没有理由在不需要的情况下增加答案的复杂性。@MilesRout我们知道OP想知道为什么他的malloc不起作用。我们不知道他最终打算如何使用它,也不应该做出假设。没有ne对于一个假设的约束条件,我们试图反驳这个答案,这对OP来说可能根本不重要。VLA也不是免费的。不,你不应该。这将导致内存碎片。@MilesRout;那么你将如何创建2D数组?@MilesRout内存碎片与这个问题无关。在一些用例中,这是一个很好的方法和碎片优化不是问题。@MilesRout但不是在这个问题上。在C中有很多方法可以实现2D数组,没有一种比其他方法更好。它们只是有不同的权衡。没有理由在不需要的时候增加答案的复杂性。@MilesRout我们都知道OP想知道为什么他的malloc不起作用。我们不知道他打算如何解决我们的问题最后,我们不应该做假设。没有必要因为一个假设的约束而抨击这个答案,这对OP来说可能根本不重要。VLA也不是免费的。@MilesRout是的,如果用户为n
@user3386109输入一个大值,那么你可以使堆栈溢出。好吧,这是一个关于堆栈溢出的网站,否?-抱歉无法抵抗。感谢迈尔斯关于C99的补充。@MilesRout是的,如果用户为n
@user3386109输入一个较大的值,您可以使堆栈溢出。这是一个关于堆栈溢出的网站,否?-抱歉无法抵抗。感谢迈尔斯关于C99的补充。