将const char **转换为void *?

斯蒂金

考虑以下代码:

#include <memory.h>
#include <stdlib.h>

void Foo()
{
  const char ** caps = malloc( sizeof( char * ) );
  memset( caps, 0, sizeof( char * ) );
}

使用gcc 4.9.2 -pedantic可以正常编译,但是clm 18(来自VS2013的那个)和默认选项warning C4090: 'function' : different 'const' qualifiers在memset行上

现在caps是一个指向const char的指针吗?因此,指针本身不是const,因此void*我认为它应该可以毫无问题地转换为,但是cl似乎会自动const void*从中产生警告。这是对正在发生的事情的正确解释吗?这是非标准行为,对吗?

达蒙

编译器过于狂热(读为:编译器错误)。

const char** caps表示caps是一个指向常数的a的指针(非恒定)char也就是说,您保证不会char通过over的间接修改caps
这意味着您与编译器正式签订了以下合同:

  1. 你被允许改变caps
  2. 你被允许改变*caps(在char*caps点)。
  3. 你是不是允许改变**caps(在char*caps点,(这caps点))通过这条产业链的指针
  4. 关于改变该字符的值的其他任何人(例如,别名指针)都一无所知。

    const char ** caps = malloc(sizeof(char *));

caps用合法的值初始化万一malloc失败,该值是一个空指针,但是从语言的角度来看,这通常也是完全合法的(尽管这会导致后面memset的代码崩溃)。在C ++中,将需要显式地转换void*by返回值malloc,但是C允许这种事情很好。

memset(caps, 0, sizeof(char*));

使我的头发站起来(我是C ++程序员),但是从C语言的角度来看,这绝对是一件合法的事情。
它的作用是覆盖到目前为止已分配但尚未初始化(并由指向caps)的内存块,该内存块包含第二个指针,该第二个指针的零字节数等于指针(char指针的大小)。

带非常量的库函数memset仅用您提供的值(此处为零)void*填充您要求的字节数(此处sizeof(char*)为)。它与您与编译器签订的合同无关,也不需要在意。但是即使如此,它也没有违反任何规则。它会覆盖指针,而不是指向常量的值。
是的,它在不是s数组的char东西中写入了几个(这就是为什么我的头发挺立的原因),但是……那是合法的就是这样charmemset毕竟,它应该可以做到,并且很可能“按预期工作”。它将指针设置为零位模式,除了一些非常罕见的奇特体系结构外,该模式对应于空指针。

绝对不会**caps更改(或什至访问)内存位置,因此所有这些都是完全合法的,您没有违反任何承诺。

因此,警告是错误的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将 void (*)() 转换为 void (*)(unsigned char)

来自分类Dev

C:将void(*)(void *)转换为void(*)(char *)

来自分类Dev

将void函数转换为char * C ++

来自分类Dev

将void函数转换为char * C ++

来自分类Dev

是否可以将void *转换为char **?

来自分类Dev

将C ++ const char *转换为char *

来自分类Dev

C将const char *转换为char

来自分类Dev

将const Char *转换为Char数组

来自分类Dev

在C中将const void *转换为const char *

来自分类Dev

将const char **转换为std :: vector <const char *>

来自分类Dev

如何将 const char* 转换为 const unsigned char*

来自分类Dev

将String ^转换为const char *

来自分类Dev

将const char *转换为QString

来自分类Dev

将Constexpr强制转换为const char []

来自分类Dev

无法将“ TCHAR *”转换为“ const char *”

来自分类Dev

将const char *转换为std :: string

来自分类Dev

无法将'int'转换为'const char *'

来自分类Dev

将(const)char *转换为LPCWSTR

来自分类Dev

将const char *转换为QString

来自分类Dev

无法将“ TCHAR *”转换为“ const char *”

来自分类Dev

将表格CString转换为const char *

来自分类Dev

无法将 QString 转换为 Const Char*

来自分类Dev

将const char *转换为const wchar_t *

来自分类Dev

将void *(不带\ 0的char *)转换为std :: string

来自分类Dev

如何正确将char ** x强制转换为const char **

来自分类Dev

无法将参数1从char转换为strcmp的const char

来自分类Dev

如何将 const char* 转换为 char[256]

来自分类Dev

将char [] []转换为char **

来自分类Dev

如何将System :: String转换为const char *?