分段错误 - C中的声明和init数组

时间:2013-10-26 00:32:18

标签: c arrays segmentation-fault

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

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

在我的主要方法中:

 Matrix A;
    A.n = 3;
    A.m = 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同样的问题。 你能帮忙吗

3 个答案:

答案 0 :(得分:3)

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

要使您的示例有效,请添加

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

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

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

float elts[9];

但这不允许调整数组的大小。

答案 1 :(得分:2)

您需要为A.elts分配内存以指向。您可以使用malloc执行此操作。你正在做的是将你指定的常量数组应对到elts碰巧指向的地址(它是未初始化的)。

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

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

答案 2 :(得分:2)

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

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