在C语言中使用结构体的Malloc函数

3

我有一个结构体:

struct numbers_struct {
char numbers_array[1000];
};

struct numbers_struct numbers[some_size];

创建结构体后,输入一个整数数字:
scanf("%d",&size);

我需要使用malloc(size)并指定数组数字的大小。 (用size代替some_size)

在C语言中是否有这样的功能?


在C语言中没有VLA,而应该使用calloc。 - perilbrain
@perilbrain:大家对calloc有什么看法?与malloc唯一的实际区别是它初始化内存。 - Jan Hudec
@JanHudec:那数组呢??? - perilbrain
@perilbrain:不,C语言没有可变长度数组。但是问题已经提到了malloc - Jan Hudec
4
VLAs是在C99中引入的。 - hmjd
@hmjd:实际上我想提到在某些有限的条件下它们是可以的,但我觉得这会使问题变得过于复杂化。 - Jan Hudec
5个回答

5

是的,但是malloc()需要为数组分配所需的总内存量,而不是元素数量:

struct numbers_struct* numbers = malloc(size * sizeof(*numbers));
if (numbers)
{
}

请注意,在使用size(在此情况下是一个糟糕的名称)之前,您必须检查scanf()的返回值,否则如果scanf()失败,代码可能会使用未初始化的变量:
int number_of_elements;
if (1 == scanf("%d", &number_of_elements))
{
    struct numbers_struct* numbers =
        malloc(number_of_elements * sizeof(*numbers));
    if (numbers)
    {
        free(numbers); /* Remember to release allocated memory
                          when no longer required. */
    }
}

可变长度数组在C99中被引入,但是它们的使用有一些限制(例如不能在文件作用域中使用)。


4
也许你可以像这样做。
 struct numbers_struct {
char numbers_array[1000];
};

scanf("%d",&size);

struct numbers_struct *numbers = malloc(sizeof(numbers_struct) * size);

如果这是纯C,你需要编写sizeof(struct numbers_struct)。在C++中,结构体名称会自动typedef。或者在定义结构时,您必须在C中创建一个typedef。 - fkl

1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int  main(void){
    struct numbers_struct {
        char numbers_array[1000];
    };

    int size = 10;
    int i;
    struct numbers_struct *s= malloc(size * sizeof(struct numbers_struct));

    for (i=0;i<size;i++){
        snprintf(s[i].numbers_array, 20, "test index %d", i);
    }

    for (i=0;i<size;i++){
        printf("%s\n", s[i].numbers_array);
    }

    free(s);
}

不需要对 malloc 的结果进行强制类型转换。 - Alex Reynolds

1

C99中可以使用VLA。

你可以做到。

int main()
{
char *p;//I have used char you can use any pointer
int k;
scanf("%d",&k);
p=malloc(k);//just allocated the memory and given the  memory address to p

//after use 
free(p);
}

它将会编译而不会出现任何错误。


1
请在文档中查看有关 "calloc"、"alloc" 和 "realloc" 的用法。

大家对calloc有什么看法?与malloc唯一的实际区别是它初始化内存。 - Jan Hudec
@JanHudec:#1:有时初始化很有用。#2:可读性-它清楚地表明您分配了大小为S的N个元素。#3:如果n * m溢出,malloc(n * m)的行为会很奇怪,而calloc(n,m)会很好地失败。 - ugoren

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