【问题标题】:Segmentation Fault - declare and init array in C分段错误 - 在 C 中声明和初始化数组
【发布时间】:2013-10-26 00:32:18
【问题描述】:

我对 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,同样的问题。 可以帮忙吗

【问题讨论】:

    标签: c arrays segmentation-fault


    【解决方案1】:

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

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

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

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

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

    float elts[9];
    

    不过,这将不允许调整数组的大小。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-06-03
          • 1970-01-01
          • 1970-01-01
          • 2021-04-15
          • 2018-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-26
          相关资源
          最近更新 更多