2

我有这样的事情

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

现在如果我尝试做 free(temp); 它的崩溃;

任何想法,我是一个初学者。

4

2 回答 2

14

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

给定以下变量声明:

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

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

char *temp, *xyz;

下一步:您混淆了sizeofwith的用法strlensizeof为您提供类型或该类型变量占用的大小。所以如果temp是 a char *,那么sizeof(temp)将是指针的大小,而不是C 字符串的长度。要获得 C 字符串长度 - 例如要获得复制给定 C 字符串所需的缓冲区大小 - 使用strlen.

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

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

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

于 2012-08-19T18:51:59.000 回答
0

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

于 2012-08-20T15:29:40.457 回答