Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在内存中执行2D数组表示时导致分段错误:11_C_Segmentation Fault - Fatal编程技术网

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]
创建了一个指针,但该指针没有指向任何东西。您需要为阵列分配内存。Try
int(*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,我将永远记住这一点。非常感谢!!!谢谢你们的快速反应。