[英]Core dumped/ Segmentation fault when running the code
当我运行它时,我收到有关返回本地地址的警告,这是合理的,因为所有这些函数都将返回本地地址。 但是,我需要这些函数来返回一个矩阵,因为我需要在我的代码中进行调制。 主要问题是在我的 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);
}
嘿嘿,
分段错误是编译器警告您的结果! 在matrix_create
function 中,您创建一个float*
的本地数组。 在 c 中,当你返回一个数组时,它只会返回数组中第一个元素的地址。 当 function 返回时,堆栈收缩,并且此 memory 不再是您程序的一部分。 当您使用[]
运算符时,您将取消引用指向matrix_create
返回的地址的指针。 由于此 memory 不再属于您的程序,因此您会遇到分段错误。 In order to solve it, you should also allocate the required memory for the float*
on the heap with malloc
, such that you can keep using the memory after the function returns:
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;
}
请记住,您不应该只在堆上分配 memory,还应该在不再需要它之后释放它!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.