释放malloc失败

时间:2012-08-19 18:50:39

标签: c

我有这样的事情

char *temp, xyz;
temp = (char *)malloc(sizeof(somestring));

xyz = (char *) malloc(sizeof(temp));
xyz= strrchar(temp, "_"); // temp does not contain "_", but need to check for error validation

现在如果我尝试做的话     自由(临时); 它崩溃了;

任何想法,我都是初学者。

2 个答案:

答案 0 :(得分:14)

第一个问题是xyz 被声明为char *,只有char

给出以下变量声明:

char *temp, xyz;
  • temp是指向char
  • 的指针
  • xyz只是char

* 适用于这两个变量。要使两个变量都指向char,请使用:

char *temp, *xyz;

下一步:您将sizeof的使用与strlen混淆。 sizeof为您提供该类型或类型变量占用的大小。因此,如果tempchar *,那么sizeof(temp)将是指针的大小,不是 C字符串的长度。获得C字符串长度 - 例如获取复制给定C字符串所需的缓冲区大小 - 使用strlen

最后,除非你省略了一些重要的代码,否则会出现另一个问题:简单地使用malloc对新分配的内存没有任何作用,所以在:

之后
temp = (char *)malloc(sizeof(somestring));

temp指向未初始化的内存位(如上所述,可能比您认为使用sizeof而不是strlen更小)。然后你继续使用 temp,好像它是一个有效的C字符串,strchr。这可能会访问不属于您的内存,从而调用未定义的行为。

答案 1 :(得分:0)

我明白了,如果我错了,请纠正我, xyz只是指向字符串temp中具有“_”的位置。一旦我释放了温度,那个位置就被释放了。但xyz仍然指向已经释放的位置。这就是我在释放xyz时崩溃的原因。