我有这个结构
typedef struct Rectangle{
char *name;
int size;
}RCG;
typedef struct Shapes{
RCG *rectangle;
}SHP;
这是我的问题,我动态地为RCG分配了20;
SHP shp;
shp.rectangle = (RCG*)malloc(sizeof(RCG *) * 20)
还将内存分配给指针内的矩形名称;
shp.rectangle[0].name = malloc(10*sizeof(char));
shp.rectangle[0].name = "big";
我怎么能取名? 我做的是
free(shp.rectangle[0].name);
它给我一个错误" 堆可能已损坏"
我使用visual studio 2010
答案 0 :(得分:2)
使用以下行时
shp.rectangle[0].name = "big";
您正在将指针设置为与原始返回值malloc
不同的位置。
您可能想要的是以下内容。
memcpy(shp.rectangle[0].name, "big", strlen("big") + 1)
此外,指针是否在结构内部是不相关的。即使指针未在结构中定义,您也会遇到同样的问题。
更新:如下面的评论所述,由于我们在这种特殊情况下处理字符串,因此使用函数strncpy
而不是更通用的memcpy
可能更合适。
strncpy(shp.rectangle[0].name, "big", 10*sizeof(char))
请注意,10*sizeof(char)
上面是硬编码的,因为它是早期malloc
的大小。
答案 1 :(得分:0)
这:shp.rectangle[0].name = "big";
不会将字符复制到已分配的空间中,而是分配字符串的地址" big"到指针名称。分配的内存不再在任何地方被引用,因此您无法释放它。相反,你试图释放字符串" big"实际上,这是你的可执行文件的一部分。
memcpy甚至更好的strcpy通常用于复制字符串;这些将在名称中为每个字符分配" big"。
中的相应值