相关疑难解决方法(0)

在C中,为什么有些人在释放之前会抛出指针?

我正在研究一个旧的代码库,几乎每次调用free()都会在其参数上使用强制转换.例如,

free((float *)velocity);
free((float *)acceleration);
free((char *)label);
Run Code Online (Sandbox Code Playgroud)

其中每个指针都是相应的(和匹配的)类型.我完全没有理由这样做.这是非常古老的代码,所以我想知道它是否是K&R的东西.如果是这样,我实际上希望支持可能需要这个的旧编译器,所以我不想删除它们.

使用这些演员阵容有技术原因吗?我甚至没有看到使用它们的实用理由.在释放数据类型之前提醒自己有什么意义?

编辑:这个问题不是另一个问题的重复.另一个问题是这个问题的一个特例,如果亲密的选民能够阅读所有的答案,我认为这是显而易见的.

Colophon:我给出了"常量答案"的核对标记,因为这可能是为什么需要这样做的真正原因; 然而,关于它是一个ANSI C之前的习惯(至少在一些程序员中)的答案似乎是它在我的情况下使用的原因.很多人在这里有很多好处.感谢您的贡献.

c pointers casting

164
推荐指数
6
解决办法
1万
查看次数

我应该显式地转换malloc()的返回值吗?

我想询问以下案例:

char *temp;
temp = malloc(10);
Run Code Online (Sandbox Code Playgroud)

由于返回类型mallocvoid*,在被分配给temp之前,是否会malloc被隐式转换为char*类型返回的指针?标准在这方面说了什么?

如果我们的指针变量是某种结构类型,例如:

struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)

如果我们将内存分配给temp而不struct node*将其强制转换为类型,是否会将其隐式转换为struct node*类型,还是必须将其显式转换为struct node*类型?

c pointers casting

52
推荐指数
3
解决办法
2万
查看次数

malloc/free in C++:为什么free不接受const void*,有更好的方法吗?

将C++ 11代码连接到一些C回调,我必须传递const char * const *,即一个字符串数组.这是我的代码的简化版本:

int main(int,char**){
  const int cnt = 10;
  const char * const * names =
    static_cast<const char * const *>(malloc( sizeof(char*) * cnt));
  //... allocating names[0], etc. coming soon ...
  the_c_function(names);
  free(names);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我研究了如何malloc在C++中使用,但我坚持free,因为它告诉我:"从'const void*'无效转换为'void*'[-fpermissive]"

我的第一反应是"呃?你为什么关心,所有你需要做的就是释放指针." 第二反应是把它扔掉.但这会被编译器拒绝:

free( const_cast<void*>(names) );
Run Code Online (Sandbox Code Playgroud)

这也是如此:

free( static_cast<void*>(acctnames) );
Run Code Online (Sandbox Code Playgroud)

例如"从类型'const char*const*'中的static static_cast'到'void*'类型".

什么的工作是一个很好的"OLEÇ投:

free( (void*)(acctnames) );
Run Code Online (Sandbox Code Playgroud)

那是安全的,还是我在这里遗漏了什么?(valgrind告诉我"所有堆块都被释放 - 没有泄漏可能",这是一种安慰!)

PS在Linux上使用g ++ 4.8.1.

更新:解释为什么free()想要一个非常量指针在这里:无法释放C中的常量指针 (虽然我发现barak …

c c++

5
推荐指数
1
解决办法
1421
查看次数

标签 统计

c ×3

casting ×2

pointers ×2

c++ ×1