我对来自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
同样的问题。
你能帮忙吗
答案 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));