【问题标题】:Core dumped/ Segmentation fault when running the code运行代码时核心转储/分段错误
【发布时间】:2020-12-02 01:27:06
【问题描述】:

当我运行它时,我收到一个关于返回本地地址的警告,这是合理的,因为所有这些函数都将返回一个本地地址。但是,我需要这些函数来返回一个矩阵,因为我需要在我的代码中进行调制。主要问题是在我的 PC 上运行此程序时出现核心转储/分段错误错误。

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

    #define N 10

    float *A[N], *B[N], *C[N];
    int i, j, k;

    float** matrix_create(int n){
      float* M[n];
      for (i = 0; i < n; i++)
        M[i] = (float*)malloc(n * sizeof(float));
      return M;
    }

    float** add(float* M1[], float* M2[], int n){
      float** M3 = matrix_create(n);
      for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
          M3[i][j] = M1[i][j] + M2[i][j];
      return M3;
    }

    float** sub(float* M1[], float* M2[], int n){
      float** M3 = matrix_create(n);
      for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
          M3[i][j] = M1[i][j] - M2[i][j];
      return M3;
    }

    void print(float* M[], int n){
      for (i = 0; i <  n; i++){
        for (j = 0; j < n; j++)
          printf("%f\t", M[i][j] );
        printf("\n");
        }
    }

    int main(){

      int count = 0, i,j, k;

      for (i = 0; i < N; i++)
        A[i] = (float*)malloc(N * sizeof(float));
      for (i = 0; i < N; i++)
        B[i] = (float*)malloc(N * sizeof(float));
      for (i = 0; i < N; i++)
        C[i] = (float*)malloc(N * sizeof(float));


       for (i = 0; i <  N; i++)
         for (j = 0; j < N; j++){
            A[i][j] = ++count;
            B[i][j] = count;
            }

    float** D = add(A, B, N);
    print(D, N);


    }

【问题讨论】:

    标签: c


    【解决方案1】:

    嘿嘿,

    分段错误是编译器警告您的结果!在matrix_create 函数中,您创建了一个float* 的本地数组。在c中,当你返回一个数组时,它只会返回数组中第一个元素的地址。当函数返回时,堆栈收缩,这块内存不再是程序的一部分。当您使用[] 运算符时,您将取消引用指向matrix_create 返回的地址的指针。由于此内存不再属于您的程序,因此您会遇到分段错误。为了解决这个问题,你还应该用malloc为堆上的float*分配所需的内存,这样在函数返回后你可以继续使用内存:

    float** matrix_create(int n){
        float** M = malloc(n * sizeof(float*));
        for (i = 0; i < n; i++)
        M[i] = (float*)malloc(n * sizeof(float));
        return M;
    }
    

    请记住,您不应该只在堆上分配内存,还应该在不再需要它之后释放它!

    【讨论】:

    • 非常感谢您的精彩解释。静态分配内存的第一行呢?
    • 免费的代码行是什么?在循环中?
    • 当你使用static关键字时,内存会在堆外或栈外预分配给它!内存位置始终相同,因此当您在函数调用中分配一次变量并且函数退出时,您可以在下次调用函数时再次使用完全相同的变量。考虑它的一种方法是每次调用函数都将使用完全相同的变量。 (编辑一次,到处编辑)!
    • 当你使用x = malloc(N) 时,你要求操作系统给你 N 数量的内存供你的程序使用。此内存是在堆上分配的,因此当您的函数退出时,内存仍然存在。不幸的是,内存不是无限的,因此最好通过调用free(x) 将分配给操作系统的内存“归还”给操作系统。我建议您阅读一下在正常声明/定义变量(在堆栈上)、使用 malloc (在堆上)以及使用 static 关键字时如何保留内存的区别!
    • 感谢您的精彩解释,但我的意思是我在程序中使用的代码行:float* M[n]。为什么这不起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多