【问题标题】:Malloc with structs in CMalloc 与 C 中的结构
【发布时间】:2012-10-02 23:44:30
【问题描述】:

我有一个结构:

struct numbers_struct {
char numbers_array[1000];
};

struct numbers_struct numbers[some_size];

创建struct后,有一个整数作为输入:

scanf("%d",&size);

我需要使用malloc(size) 并指定数组编号的大小。 (而不是 some_size 使用大小)

在 C 中这样的事情可能吗?

【问题讨论】:

  • C 中没有 VLA,而是使用 calloc
  • @perilbrain:大家对calloc 有什么看法?与malloc 的唯一实际区别是它初始化了内存。
  • @JanHudec:- 那么数组呢???
  • @perilbrain:不,C 没有可变长度数组。但问题已经提到malloc
  • @JanHudec,VLA 是在 C99 中引入的。

标签: c malloc


【解决方案1】:

是的,但 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 中引入的,但它们的使用受到限制(例如,它们不能在文件范围内使用)。

【讨论】:

    【解决方案2】:

    也许你可以这样做

     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
    【解决方案3】:

    请参阅文档中的“calloc”、“alloc”和“realloc”用法。

    【讨论】:

    • 大家对calloc有什么看法?与malloc 的唯一实际区别是它初始化了内存。
    • @JanHudec:#1:初始化有时很有用。 #2:可读性 - 它清楚地表明您分配了 N 个大小为 S 的元素。 #3:如果 n*m 溢出,malloc(n*m) 的行为会很奇怪,而 calloc(n,m) 会很好地失败。
    【解决方案4】:
    #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的结果。
    【解决方案5】:

    VLA 在 C99 中是可能的。

    你可以做到的

    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);
    }
    

    它会编译没有任何错误。

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 2016-02-27
      • 2012-01-19
      • 2011-02-12
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      相关资源
      最近更新 更多