C - 在源文件中创建结构

时间:2017-05-08 20:30:55

标签: c function struct header

我在最近6个小时里闲逛,试图解决这个该死的问题。首先,我是一个完整的c编程新手,所以请不要期待我太多... 我需要编写一个programm,它在struct中创建一个Integer Array。所以我写了一个标题并制作了另一个名为" intarray.c"的源文件。除了主要,因为我必须这样做。我包括了所有等等,现在我需要一个函数,它得到一个参数" int n",用于在结构内部创建int数组a [n]。但是我无法解决这个问题。对不起我的不好解释,但我不知道我在这里做了什么。我也尝试过使用指针,但这使我很困惑,我不确定它们是否必要。

我的标题如下:

#ifndef INTARRAY_H_INCLUDED
#define INTARRAY_H_INCLUDED

struct IntArray
{
    int length;
    int numbers[];
};
void create(int);
void destruct();
void read(int);
void write(int, int);

#endif // INTARRAY_H_INCLUDED

我的功能如下:

create(int n)
{
    struct IntArray arr;
    arr.length = n;
    arr.numbers[n];
}

但现在我无法在其他功能中使用该结构,例如如果我想在特定位置写入数组。我怎么解决这个问题? 并提出愚蠢的问题。

2 个答案:

答案 0 :(得分:0)

您需要动态分配内存:

struct IntArray
{
    int length;
    int * numbers;
};

struct IntArray * create(int len) {
    struct IntArray * ret = malloc(sizeof(struct IntArray));
    ret->length = len;
    ret->numbers = malloc(len * sizeof(int));
    return ret;
}

答案 1 :(得分:0)

当您使用灵活数组成员(FAM)时,您需要将结构和数组的内存显式分配为单个分配,如{{3他们的BLUEPIXY

您还需要编写可编译的代码:

struct IntArray *create(int n)
{
    struct IntArray *result = malloc(sizeof(*result) + n * sizeof(result->numbers[0]));
    if (result != NULL)
        result->length = n;
    return result;
}

如果您使用的是64位系统,基本结构的大小可能是8个字节,而不是您通常期望的4个字节,因为指针需要在8字节上对齐边界因此编译器添加了4个字节的填充。在32位系统上,大小为4,因为灵活阵列成员的大小不包含在结构的大小中。