c - C程序结束时的段错误

标签 c

代码末尾是否存在段错误(只是为二维数组分配内存并打印结果)?正在打印最后一个 printf 语句,我在最后添加的任何代码都成功运行,然后出现段错误。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int n,i,j,**mat;

    printf("\nEnter the size of the square matrix: ");
    scanf("%d",&n);

    *mat = (int **)malloc(n*sizeof(int *)); 

    for(i=0;i<n;i++)
    {
      mat[i]= (int *)malloc(n*sizeof(int));
    }

    for(i=0;i<n;i++)
    {
      for(j=0;j<n;j++) printf("%d\t",mat[i][j]=rand()%10*i+j);
      printf("\n\n\n");
    }

    printf("Bye\n");
    return 0;
}

从技术上讲,第 8 行(打印在代码中)的 *mat 应该是 mat,但之后一切正常。提到的代码可以编译(在 gcc 中有明显的不兼容指针类型警告)并且可以正常工作,但最后打印段错误时除外。 如果程序中有段错误,它就不会运行到最后!

最佳答案

*mat = (int **)malloc(n*sizeof(int *));

应该是

mat = (int **)malloc(n*sizeof(int *)); 

除非我将这一行改成这样,否则程序就会出现段错误。通过纯粹的运气和未定义的行为,您的程序设法运行了一段时间。

也没有必要转换malloc的返回值。 Here您可能不应该这样做的几个原因。

关于c - C程序结束时的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34273675/

相关文章:

c++ - 函数名称与序数值 - 从 DLL 模块获取函数地址

c++ - 未初始化的局部变量是最快的随机数生成器吗?

c - 视觉 C++ : replace malloc/free

c++ - 如何在 C 中获得到核心映射的进程?

c - 排序链表(ADT优先级队列)

c - 这段 C 代码中的括号如何使结果如此不同?

c - 为什么可以将另一种类型的参数传递给函数?

c - 从电子邮件下载可执行应用程序时自动启动

c - 通过单声道辅助线将音调从 arduino 发送到 3.5 毫米插孔的扬声器

c - 共享库函数什么时候加载到堆中?