0

我对 C 非常陌生。来自 Python、Java 和 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同样的问题。你能帮忙吗

4

3 回答 3

3

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

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

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

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

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

float elts[9];

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

于 2013-10-26T00:34:58.353 回答
2

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

您还可以A.elts像这样指向常量数组:

float *myFloats = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
A.elts = myFloats;
于 2013-10-26T00:34:25.510 回答
2

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

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

于 2013-10-26T00:36:24.333 回答