分段错误 – 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));