微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C更改结构

如何解决C更改结构

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

嗨,我正在尝试更改结构内部数组的大小,但它会出错。我尝试先做一个空数组,但这并没有解决。有帮助吗?

解决方法

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

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

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

,

如果不使用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;
}
,

您可以使用一个灵活的数组来做一些接近的事情:

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

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

,

正如您所定义的,namestruct中三个元素的数组。因此,其大小无法更改。如果希望能够动态更改大小,可以将其声明为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字段,将其设置为当前大小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。