在C语言中如何定义一个全局结构体指针?

4

我需要确定一个由4个整数组成的全局结构(数组)。 问题是,该结构数组的大小事先不知道。

我正在尝试创建类似于以下内容的东西:

typedef struct
{
    int value;
    int MAXleft;
    int MAXright;
    int MAX;
} strnum;

int main ()
{
    int size;
    scanf("%d", &size);

    strnum numbers[size];

    return 0;
}

我听说可以通过指针来实现这个功能,但我不知道如何操作。

3个回答

5
您可以像这样动态地为多个结构体分配空间:
strnum *numbers = malloc( size * sizeof(strnum) );

然后你可以像使用普通数组一样使用它(大多数情况下)。

使用calloc可能比malloc更方便。它分配一定数量的块并将它们填充为零。请注意,malloc不清除已分配的内存。

strnum *numbers = calloc( size, sizeof(strnum) );

完成内存操作后,请不要忘记调用free(numbers),这将把分配的内存返还给内存管理器。
如果不在不再需要时释放它并分配更多内存,程序的内存占用量将因无法合理释放而增加。这被称为内存泄漏,应该避免。它最终可能导致程序缺乏内存并产生不可预测的结果。
同时请不要忘记包含一个带有内存分配函数原型的stdlib.h头文件。

0

它被称为动态内存分配

您要尝试的事情可以按以下方式完成:

   strnum* number;
   int size = 0;

   scanf("%d",&size);

   number = malloc(size * sizeof(strnum));

另外,不要忘记在使用完数组后释放内存。
   free(number);

在C语言中,你不需要对malloc返回的内容进行强制类型转换。如果你忘记包含stdlib.h头文件,那么默认情况下返回类型是int,这可能会导致问题。如果你不进行强制类型转换,就可以避免这种情况的发生。 - AndersK
如果您分配了正确数量的内存,我认为对malloc进行强制转换不会有任何影响。 - sgarizvi
3
如果有人在32位电脑上编写了一个程序,并从malloc中分配了一段内存,并尝试在具有8字节指针和4字节整数的64位系统上编译并运行该程序,那么他或她可能会非常难以理解为什么后者不能正常工作。问题在于,如果没有原型,返回值将被截断为4字节整数,并很可能导致段错误!请注意,这里不提供任何解释,只翻译内容。 - Maksim Skurydzin
如果 sizeof(int) != sizeof(strnum *),你会遇到问题,因为你已经告诉编译器你比它更懂了,所以不会收到警告。 - AndersK

0
你可以使用malloc()开始,然后当大小不断增加时再使用realloc()。我建议您一次分配一个包含10个结构的池,这样可以减少realloc()的调用次数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接