【问题标题】:C changing size of the array inside structC改变结构内数组的大小
【发布时间】:2021-02-03 03:28:02
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1

struct Cases
    {
        char name[3];
        int cases;
    };



int main()
{
    int n=5;
    struct Cases Real;
    Real.name[0] = 'a';
    Real.name[1] = 'b';
    Real.name[2] = 'c';
    printf("Size before: %d \n", sizeof Real.name);
    Real.name = (char *)malloc(5 * sizeof(char));
    printf("Size after: %d \n", sizeof Real.name);


    return 0;
}

嗨,我正在尝试更改结构内部数组的大小,但它给出了错误。我尝试先做空数组,但也没有成功。有什么帮助吗?

【问题讨论】:

  • Real.name = (char *)malloc(5 * sizeof(char)); name 不是指针,因此您无法随时更改其大小。
  • 数组不是指针,指针不是数组。我建议你阅读comp.lang.c. faq 的第 6 部分。
  • 您也许可以使用flexible array member

标签: arrays c pointers data-structures dynamic-memory-allocation


【解决方案1】:

嗨,我正在尝试更改结构内部数组的大小

你不能改变数组的大小,它是一个常数。如果您尝试分配给任何数组类型的变量,您会看到错误,因为数组不是可修改的左值。

作为替代方案:您可以定义一个指针,并使用分配器函数动态分配内存(正如您所尝试的那样)。

【讨论】:

    【解决方案2】:

    如果不使用pointers,这是不可能的,例如,您可以使用 pointers 做到这一点:

    #include <stdio.h>
    
    int main ()
    {
         char **real = malloc (3 * sizeof (* array));
         real[0] = "a";
         real[1] = "b";
         real[2] = "c";
    
         printf ("% My array in position 0 n", real[0]);
    
         char ** tmp = realloc (real, 5 * sizeof (* array));
         real = tmp;
         real[1] = "G";
    
         printf ("% s \ n", real [0]);
         printf ("% s \ n", real [1]);
             
    
         free (array);
         return 0;
    }
    

    【讨论】:

      【解决方案3】:

      正如您所定义的,name 是一个包含三个元素的数组,位于 struct 内。因此,它的大小无法更改。如果您希望能够动态更改大小,可以将其声明为char 指针,然后动态分配存储空间(完成后释放)。

      下面是一个示例:

      
      #include <stdio.h>
      #include <stdlib.h>
      
      struct Cases
      {
          char *name;
          int cases;
      };
      
      int main(void)
      {
          struct Cases Real;
      
          Real.name = malloc(3 * sizeof(char));
          if (Real.name == NULL) {
              fprintf(stderr, "Malloc failed.\n");
              exit(1);
          }
      
          Real.name[0] = 'a';
          Real.name[1] = 'b';
          Real.name[2] = 'c';
      
          Real.name = realloc(Real.name, 5 * sizeof(char));
          if (Real.name == NULL) {
              fprintf(stderr, "Realloc failed.\n");
              exit(1);
          }
      
          Real.name[3] = 'd';
          Real.name[4] = 'e';
      
          free(Real.name);
      
          return 0;
      }
      

      在这个例子中,name 现在是一个char 指针,它首先用malloc 设置,以便能够容纳3 个元素。它后来与realloc 一起成长,能够容纳5 个元素。最后调用free释放它。

      在正常情况下,此示例不会打印任何内容。如果mallocrealloc 失败,它将打印一条错误消息。在尝试使用之前,您应该始终检查mallocrealloc 的结果,看看它是否是NULL

      请注意,这些数组在示例中没有终止空字符(尽管如果需要,您当然可以添加一个空字符,前提是您已经为其分配了空间)。还要注意sizeofname 上使用时不再有用,因为name 现在是一个指针。您需要自己跟踪大小。如果需要,您可以将size 字段添加到Cases,将其设置为当前大小。

      【讨论】:

        【解决方案4】:

        你可以用一个灵活的数组做一些类似的事情:

        struct Cases
        {
                int cases;
                char name[]; //Must be the last element in the struct   
        };
        
        int main()
        {
            struct Cases * real = (struct Cases *)malloc(sizeof(struct Cases) + 3 * sizeof(char));
            real->length  = 3;
            real->name[0] = 'a';
            real->name[1] = 'b';
            real->name[2] = 'c';
            printf("%d\n", real->length);           //=> 3
            
            real = (struct Cases *)realloc(real, sizeof(struct Cases) + 5 * sizeof(char));
            real->length  = 5;
            real->name[3] = 'd';
            real->name[4] = 'e';
            printf("%d\n", real->length);           //=> 5
        
            printf("%ld\n", sizeof(real));          //=> 8 (the size of the pointer)
            printf("%ld\n", sizeof(struct Cases));  //=> 8 (the size of the structure without the array)
            
            free(real);
            return 0;
        }
        

        但是你必须自己记住大小(为此我在结构中添加了一个字段)。

        【讨论】:

          猜你喜欢
          • 2015-01-24
          • 2015-06-22
          • 2015-08-26
          • 2020-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          相关资源
          最近更新 更多