释放结构指针内的内存

时间:2014-03-26 01:01:38

标签: c free

我有这个结构

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

2 个答案:

答案 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"。

中的相应值