在我必须维护的一些遗留代码中,只要数组要作为 (void *) 参数传递,& 运算符就会放在数组名称的前面
这是一个简单的例子:
char val = 42;
char tab[10];
memcpy(&tab, &val, 1);
它使用 gcc 或 clang 编译,没有错误或警告。它还给出了预期的结果。
这个语法合法吗?
为什么会这样?
注意:我通常使用以下语法之一:
memcpy(tab, &val, 1);
memcpy(&tab[0], &val, 1);
结语:
作为附加测试,我使用了一个接受 (char*) 参数而不是 (void*) 参数的函数
如果我尝试使用 clang 进行编译,我会收到以下警告:
warning: incompatible pointer types passing 'char (*)[10]' to parameter of type 'char *' [-Wincompatible-pointer-types]
<我> 编辑 1: 在原始示例中,选项卡的大小为 1 个元素
为了通用起见,我只是将大小更改为 10。
编辑2: 正如答案中提到的,memcpy 采用 (void*) 而不是 (char*)
最佳答案
memcpy
的参数类型是void*
,不是char*
。任何指针类型的参数(不包括函数指针)都被隐式转换为 void*
。这是一条特殊情况规则,仅适用于 void*
。
给出声明
char tab[1];
tab
或 &tab
都可以作为 memcpy
的有效参数。它们计算不同类型的指针(char*
和 char (*)[1]
),但都指向相同的内存位置;转换为 void*
会产生相同的值。
对于实际需要char*
参数的函数,只有tab
有效; &tab
类型错误。 (对于像 printf
或 scanf
这样的可变参数函数,编译器可能无法检测到类型不匹配。)
关于c - 访问数组内容的可疑语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469696/