在我必须维护的一些遗留代码中,每当数组作为 (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*)