分段错误 – C语言中的声明和init数组

我对来自Python,Java和C#世界的C.非常新。 这可能是一个愚蠢的问题,但我得到分段错误:

// struct for storing matrices typedef struct { int m; int n; float* elts; } Matrix; 

在我的主要方法中:

  Matrix A; An = 3; Am = 3; memcpy( A.elts, (float[]) {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f}, 9 * sizeof(float)); // seg fault because of this memcpy. 

我也试过没有f ,同样的问题。 你能帮忙吗?

您需要为A.elts分配内存以指向。 你可以用malloc做到这一点。 你正在做的是将你指定的常量数组应用到elts碰巧指向的任何地址(它是未初始化的)。

你也可以将A.elts指向常量数组,如下所示:

 float *myFloats = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f }; A.elts = myFloats; 

在C数组和指针是相关的,但它们是不一样的。 声明指针以使其成为数组是不够的:您需要将该指针设置为指向足够大小的内存块的值。

要使您的示例正常工作,请添加

 A.elts = malloc(sizeof(float) * 9); 

在调用memcpy之前。 否则,指针elts保持未初始化,因此写入该指针指向的内存是未定义的行为。 请注意,完成数组后,您需要调用free(A.elts)

另一种方法是将elts声明为固定大小的数组,而不是指针:

 float elts[9]; 

但是,这不允许调整arrays的大小。

您尚未分配任何内存来保存浮点值。 在memcpy之前,您需要以下内容:

A.elts = malloc(9 * sizeof(float));