在C矩阵中的分段错误
我试着在C中创建一个矩阵,并有一些输入值,但我不知道它为什么会抛出“分段错误”。这是我的代码:在C矩阵中的分段错误
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
int j;
int **a;
a = malloc(5 * sizeof(int));
for (i = 0; i < 5; i++) {
a[i] = malloc(4 * sizeof(int));
}
for (i = 0; i < 5; i++) {
for (j = 0; j < 4; j++) {
scanf("%d", (a[i][j]));
}
}
return 0;
}
- 您的
a
分配应该是
a=malloc(5*sizeof(int*));
注以及在sizof
指针类型。在某些系统(2000年初的Windows桌面)上,int
恰好与int*
大小相同,但是您的肯定不是。
scanf
需要指针作为参数:写这个最清晰的方式是scanf("%d", &a[i][j]);
一旦你都不要忘记
free
内存完成。
最后,我每次看到一个像这样建模的矩阵时,都会死在里面。当然,它允许您使用[][]
表示法,但通常最好将其建模为连续内存块,并使用成语i * columns + j
访问(i, j)
上的元素。
给出的答案被@Bathsheba,这是你的代码应该是什么样子:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int (*a)[4] = malloc(sizeof(int[5][4]));
for(int i=0;i<5;i++)
{
for(int j=0;j<4;j++)
{
scanf("%d", &a[i][j]);
}
}
free(a);
return 0;
}
Upvoted。这是“王牌”答案,但我没有足够的信心来使用它,特别是当你不得不考虑衰减指针时。 – Bathsheba
@Bathsheba数组指针不会衰减。当把这个数组指针传递给一个函数时,你只需要声明这个函数为'void func(size_t x,size_t y,int array [x] [y])''。其中'int array [x] [y]'将被编译器(“decay”)调整为指向第一个元素的指针:int(* array)[y]'。这正是我们在调用者中所拥有的。 – Lundin
这很有帮助。事实上,这大部分都高于我的薪酬等级。请随时从我的答案中挑选一些方面,并将其纳入本文。 – Bathsheba
它应该是'的scanf( “%d”,&(A [i] [j]));' – MayurK
如果你用gcc编译,它警告你你使用的是scanf错误,解决gcc警告通常可以解决很多问题。 –