【问题标题】:free up on malloc fails释放 malloc 失败
【发布时间】:2012-08-19 18:50:38
【问题描述】:

我有这样的事情

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 被分配了 strcpy call strcpy(temp, something);

标签: c


【解决方案1】:

第一个问题是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。这可能会访问不属于您的内存,从而引发未定义的行为。

【讨论】:

  • 实际上 xyz 是 char * 类型,这是一个错字(我的错)。我现在已将 sizeoff 更改为 strlen 。但我仍然有同样的问题,顺便说一句,在 malloc 之后我确实有 strcpy(temp, something);如果我在这个“temp”上进行调试,就会得到我期望的字符串。现在代码块如下所示 char *temp, *xyz; temp = (char *)malloc(strlen(somestring)); strcpy(临时,某事); // 某物中的值被复制到 temp xyz = (char *) malloc(strlen(temp)); xyz=strrchar(温度,“”); // temp 不包含“”,但需要检查错误验证
  • if(temp !=NULL) free(temp);如果(某事!= NULL)免费(某事);这就是我最后所拥有的,我看到崩溃的地方
【解决方案2】:

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

【讨论】:

  • 是的,这会导致问题。当你使用strchr 时,你只需要一个char * 指针来引用字符串的一部分,通过指向memoru inside 已经分配的字符串。这个指针,在你的例子中是xyz,不需要需要为其分配内存,也不需要被释放。您将释放原始字符串 - 仅 如果它是使用 malloc 动态分配的 - 在稍后的某个时间点,假设您正确保留了对它的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2012-02-07
  • 2021-02-02
  • 2017-09-03
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多