Char *data = "abc";释放((void*)data);为什么是void*转换?有必要
char *data = "abc"; free( (void*)data ); Why void* conversion? Is it necessary?
有一个c风格的字符串,我需要释放它的内存。我看到了下面的代码示例,但对(void*)
在那里的原因感到困惑。
char *data = "abc";
free( (void*)data );
就两个问题:
必须转换
(void*)
吗?
不,没有必要;free()
调用是错误的,您不能这样做。
cast是一个巨大的闪烁、跳跃和尖叫的警告标志,表明最初的程序员感到困惑。
将先前调用malloc()
或free()
的友端没有返回的指针传递给CC_6是未定义的行为。演员阵容是这里最小的问题。
您永远不能"释放"字符串字面值使用的内存,因为该内存永远不会以程序控制的某种方式分配。它不在堆上,堆是动态内存分配/释放通常发生的地方。你的意图是错误的。
你所能做的就是将指针设置为NULL
:
data = NULL;
不会以任何方式"释放"用于保存字符数据"abc"
的内存,但这很好。
调用free()
是错误的,因为没有使用(m/c/re)alloc
分配。
正如Jens Gustedt指出的那样,只有在传递const
指针时才需要强制转换,因为free()
接受void *
,而不是const void *
:
const int *x = malloc(sizeof(int));
free((void *)x);
如果没有cast,你会得到:
demo.c:8:5: warning: passing argument 1 of ‘free’ discards ‘const’ qualifier from pointer target type [enabled by default] In file included from demo.c:2:0: /usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘const int *’
不需要强制转换。在C语言中,void*
可以隐式地转换为其他指针类型。free
需要一个void*
,所以不需要从其他指针类型强制转换。
(当然,正如已经指出的,这段代码显然是有问题的,所以不要读得太多。)
所以,这里的前提是不正确的,您根本不需要释放您的"数据",如果您这样做,很可能会导致崩溃。对于来自malloc
的数据,您应该只调用free
,而free(data)
0不是其中之一。
char *data = malloc(4);
strcpy(data, "abc");
...
free(data);
在c++中,我们也不能将void *
[从malloc
返回的值]转换为char *
,所以你需要char *data = (char *) malloc(4);
,但free(data)
应该仍然可以工作。一些编译器可能会对此发出警告,例如,标准的MISRA不允许任何C类型的自动转换,所以这里需要显式强制转换[不是因为语言这样说,而是因为MISRA标准这样做,并且有"检查软件"读取源代码以检查这些标准是否满足]。
当然,在"fresh"[1] c++中,我们不应该使用malloc
或free
,而应该使用new
和delete
:
char *data = new char[4];
strcpy(data, "abc");
....
delete [] data;
[1]即"从头开始用c++编写的代码"。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 错误:在为指针赋值时,void值没有被忽略