【问题标题】:Casting to void * before freeing memory (C programming) [duplicate]在释放内存之前强制转换为 void *(C 编程)[重复]
【发布时间】:2018-02-28 13:45:04
【问题描述】:

我遇到了这段代码,想知道为什么在释放之前它被强制转换为void *

free((void *)array1[i]);

我在一些文章中看到free 没有强制转换,所以我想知道为什么你在释放内存时会强制转换为void *

这是他们分配和释放内存的方式:

#include <stdlib.h>

int **array1 = malloc(nrows * sizeof(int *));
for(i = 0; i < nrows; i++)
    array1[i] = malloc(ncolumns * sizeof(int));

for(i = 0; i < nrows; i++)
    free((void *)array1[i]);
free((void *)array1);

参考this,某些 gcc 版本可能会发出警告,但总的来说这是不必要的。

【问题讨论】:

  • 可能是c++。
  • dave558,很好奇,在这种情况下,array1[i] 是什么类型?它的分配是否也使用了演员表?

标签: c casting free void-pointers


【解决方案1】:

在 C 中这种转换是无稽之谈。

可能是他们在 C++ 编译器中编译代码,在这种情况下需要强制转换。但是一般来说,使用 C++ 编译器编译 C 代码并不是一个好主意。

【讨论】:

  • 即使在 C++ 中也不需要强制转换。 Life demo。如果我错了,请纠正我
  • 啊,想想看,我相信C++不允许从void*type*的隐式转换,但是反过来也可以。
  • 可能是代码位于 C 和 C++ 项目中都使用的头文件中。我有一两个头文件库,我使 C++ 兼容,以便偶尔在 C++ 项目中使用(尽管我更喜欢 C)。
  • 我想它也可以用来抛弃限定符,在这种情况下,无论是 C 还是 C++,代码都是可疑的。
  • 有些人认为在动态分配的对象在分配时设置其值并且此后不再修改的情况下,使用const T * 有助于提高常量的正确性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2011-01-07
  • 1970-01-01
  • 2011-05-09
  • 2016-03-05
  • 1970-01-01
相关资源
最近更新 更多