C 在内存中执行2D数组表示时导致分段错误:11
我只在执行第一个循环时介绍了下面的代码,它工作得很好,但一旦我取消对第二个循环的注释,它就开始抛出分段错误。我的代码如下C 在内存中执行2D数组表示时导致分段错误:11,c,segmentation-fault,C,Segmentation Fault,我只在执行第一个循环时介绍了下面的代码,它工作得很好,但一旦我取消对第二个循环的注释,它就开始抛出分段错误。我的代码如下 // Write a program to add two m*n matrices using pointer. #include <stdio.h> #define m 2 #define n 2 int main() { int (*a)[n]; int (*b)[n], i, j; //, *(sum)[n], i, j;
// Write a program to add two m*n matrices using pointer.
#include <stdio.h>
#define m 2
#define n 2
int main() {
int (*a)[n];
int (*b)[n], i, j; //, *(sum)[n], i, j;
printf("Enter first matrix:\n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
scanf("%d", *(a + i) + j);
}
}
printf("Enter second matrix:\n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
scanf("%d", *(b + i) + j);
}
}
// printf("The Sum of matrix is:\n");
// for (i = 0; i < m; i++) {
// for (j = 0; j < n; j++) {
// // *(*(sum + i) + j) = *(*(a + i) + j) + *(*(b + i) + j);
// // printf("\t%d", *(*(sum + i) + j));
// }
// printf("\n");
// }
}
//编写一个程序,使用指针添加两个m*n矩阵。
#包括
#定义m2
#定义n2
int main(){
int(*a)[n];
int(*b)[n],i,j;/,*(和)[n],i,j;
printf(“输入第一个矩阵:\n”);
对于(i=0;i
您没有将a
和b
定义为二维数组,而是定义为指向二维数组的未初始化指针。将地址传递给这些调用未定义的行为。必须使这些指针指向实际数组,可以是静态的、自动的,也可以是从堆中分配的
可以通过以下方式定义二维阵列:
int a[m][n], b[m][n];
如果需要使用指针,可以使用malloc
分配2D数组:
int (*a)[n] = malloc(sizeof(*a) * m);
int (*b)[n] = malloc(sizeof(*b) * m);
在您的程序中,使用[]
语法更具可读性,即使是指针:
#include <stdio.h>
#include <stdlib.h>
#define m 2
#define n 2
int main(void) {
int (*a)[n] = malloc(sizeof(*a) * m);
int (*b)[n] = malloc(sizeof(*b) * m);
int (*sum)[n] = malloc(sizeof(*sum) * m);
printf("Enter first matrix:\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
printf("Enter second matrix:\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &b[i][j]);
}
}
printf("The Sum of matrices is:\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
sum[i][j] = a[i][j] + b[i][j];
printf("\t%d", sum[i][j]);
}
printf("\n");
}
return 0;
}
#包括
#包括
#定义m2
#定义n2
内部主(空){
int(*a)[n]=malloc(sizeof(*a)*m);
int(*b)[n]=malloc(sizeof(*b)*m);
int(*sum)[n]=malloc(sizeof(*sum)*m;
printf(“输入第一个矩阵:\n”);
for(int i=0;i
a
和b
是未初始化的指针。它们需要正确初始化,例如使用malloc
。旁注:虽然*(*(a+i)+j)
应该可以工作,但如果以a[i][j]
int(*a)[n]的形式编写,则更容易理解代码>-这声明了一个指向n个元素数组的指针。这真的是你想要的吗?@user3386109是的,将数组变量声明为a[i][j]
很好,但是int(*a)[n]
与在二维数组指针中声明a[i][j]
做的事情不一样吗?SergeyA是的,这当然不是int(*a)[5]
与声明int[2][5]一样吗
?我不是说将变量声明为a[m][n]
。将变量声明为int(*a)[n]
并将其用作a[i][j]
是非常好的。唯一的问题是声明int(*a)[n]
创建了一个指针,但该指针没有指向任何东西。您需要为阵列分配内存。Tryint(*a)[n]=malloc(m*n*sizeof(int))代码>,同样适用于b
。伙计,不管怎样,我是从用户3386109那里得到的,谢谢!!!我猜你需要再次更正,在顶部添加这一行#include@ashim888评论是一种快速而肮脏的方式来帮助你,因为我没有时间写出完整的答案。现在chqrlie已经写了这个答案,请点击复选标记接受它。谢谢。@ashim888:谢谢。注意他的命题int(*a)[n]=malloc(m*n*sizeof(int))
有点容易出错,如果m
和n
较大,m*n
在转换为可能较大的类型size\t
进行最终乘法之前可能会溢出。例如,在x86平台上,使用此表达式分配2000x2000矩阵将失败无论什么类型*a=malloc(sizeof(*a)*元素数)
可用于任何类型和大小,以分配元素数数组
@chqrlie,我将永远记住这一点。非常感谢!!!谢谢你们的快速反应。