如何解决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;
}
但是您必须自己记住大小(为此我在结构中添加了一个字段)。
,正如您所定义的,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
来释放它。
在正常情况下,此示例不打印任何内容。如果malloc
或realloc
失败,它将打印一条错误消息。尝试使用前,应始终检查malloc
或realloc
的结果以查看其是否为NULL
。
请注意,这些数组在示例中没有终止的空字符(尽管您可以根据需要添加一个空格,前提是您已为其分配了空间)。还要注意,sizeof
在name
上使用时不再有用,因为name
现在是一个指针。您需要自己跟踪尺寸。如果需要,您可以在size
上添加一个Cases
字段,将其设置为当前大小。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。