c - 访问数组内容的可疑语法

标签 c arrays syntax

在我必须维护的一些遗留代码中,只要数组要作为 (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 类型错误。 (对于像 printfscanf 这样的可变参数函数,编译器可能无法检测到类型不匹配。)

关于c - 访问数组内容的可疑语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469696/

相关文章:

c - c中的这种字符串截断会导致内存泄漏吗?

python - 对于排序数组来说,更快地替代 np.where

scala - 转换为 Map 并访问元素的简洁语法

带有表达式的 C++ 初始化列表

c - 如何在 GCC、windows XP、x86 中编写缓冲区溢出漏洞?

c - 保留函数体中分配的内存

c - ld : file was built for unsupported file format on Mac OS X

php - 使用单个文本框在发布后继续向数组添加值

C:使用 qsort 对二维数组进行逐行排序

java - 请问a.b和a$b有什么区别?