带指针的C中的数据结构:我想在每个位置存储一组信息

时间:2014-02-05 21:14:06

标签: c arrays pointers data-structures calloc

如何在C中定义数据结构,对于我想要存储的每个位置:一个大小为M的int数组,一个大小为N的int数组和一个double值?我尝试了以下但没有成功。

在我的代码开头,我定义了我的数据结构(LOCOPT),如下所示:

typedef struct LOCOPT
{
  int    *org;
  int    *des;
  double value;
} LOCOPT;

LOCOPT *locopt;

然后,我使用calloc初始化locopt,如下所示:

for( locopt_ctr=0 ; locopt_ctr<locopt_max ; locopt_ctr++ )
{
    locopt[locopt_ctr].org = (LOCOPT *) calloc(M, sizeof(LOCOPT));
    locopt[locopt_ctr].des = (LOCOPT *) calloc(N, sizeof(LOCOPT));
}

当我尝试在代码中使用它时它不起作用:我想这样做:

for( m=0 ; m<M ; m++ )
locopt[locopt_ctr].org[m] = origin[m]; // regardless of what origin[m] is.

我需要多次使用calloc而不是一次,我不知道该怎么做。我需要正确使用循环。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您的分配存在两个问题,一个是关于locopt数组本身的内存,另一个是关于如何为每个结构中的desorg分配内存

首先,我们不会看到您是否为locopt结构数组分配内存。如果有L元素,则可以

locopt = calloc(L, sizeof(LOCOPT));

然后,你仍然需要为它中的字段orgdes分配内存(对于每个结构,就像你一样),但是

locopt[locopt_ctr].org = calloc(M, sizeof(int));

同样适用于desLOCOPT是结构的名称,但数组的类型为int

答案 1 :(得分:-1)

你想要立刻做太多事情。让我们首先将其分解为一些简单的部分:

  1. 您已宣布LOCOPT *locopt。在将locopt本身用作指针(或数组语法)之前,必须为它分配内存,例如

    locopt[locopt_ctr] = (LOCOPT *) calloc(1,sizeof(LOCOPT));

  2. 但这只是努力的一部分。

    1. 如果要在locopt的每个实例中存储项目列表,则需要在新分配的locopt实例的成员上再次调用

      locopt[locopt_ctr].org = (int *) calloc(M, sizeof(int)); locopt[locopt_ctr].des = (int *) calloc(N, sizeof(int));

    2. 底线 - 如果你有一个指针,你最终必须分配它。