我有这样的事情
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
现在如果我尝试做的话 自由(临时); 它崩溃了;
任何想法,我都是初学者。
答案 0 :(得分:14)
第一个问题是xyz
不被声明为char *
,只有char
。
给出以下变量声明:
char *temp, xyz;
temp
是指向char
。xyz
只是char
。 *
不适用于这两个变量。要使两个变量都指向char
,请使用:
char *temp, *xyz;
下一步:您将sizeof
的使用与strlen
混淆。 sizeof
为您提供该类型或类型变量占用的大小。因此,如果temp
是char *
,那么sizeof(temp)
将是指针的大小,不是 C字符串的长度。获得C字符串长度 - 例如获取复制给定C字符串所需的缓冲区大小 - 使用strlen
。
最后,除非你省略了一些重要的代码,否则会出现另一个问题:简单地使用malloc
对新分配的内存没有任何作用,所以在:
temp = (char *)malloc(sizeof(somestring));
temp
指向未初始化的内存位(如上所述,可能比您认为使用sizeof
而不是strlen
更小)。然后你继续使用 temp
,好像它是一个有效的C字符串,strchr
。这可能会访问不属于您的内存,从而调用未定义的行为。
答案 1 :(得分:0)
我明白了,如果我错了,请纠正我, xyz只是指向字符串temp中具有“_”的位置。一旦我释放了温度,那个位置就被释放了。但xyz仍然指向已经释放的位置。这就是我在释放xyz时崩溃的原因。