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