2013-10-19 18 views
4

在一些旧代码我要保持,&运营商被置于阵列名称前面每当阵列是作为(无效*)参数可疑语法来访问阵列内容

下面是一个简单的例子来进行传递:

char val = 42; 
char tab[10]; 
memcpy(&tab, &val, 1); 

它用gcc或clang编译时没有错误或警告。它也给出了预期的结果。

此语法是否合法?

这是什么工作?

注:我通常使用以下语法之一:

memcpy(tab, &val, 1); 
memcpy(&tab[0], &val, 1); 

结语:

作为附加测试,我使用的功能拍摄(字符*)参数代替(空隙*)

我得到以下警告,如果我尝试用铿锵编译:

warning: incompatible pointer types passing 'char (*)[10]' to parameter of type 'char *' [-Wincompatible-pointer-types] 

编辑1: 在原来的实例标签的尺寸1个元件的

我只是改变了大小为10,一般性起见给出。

编辑2: 如答案mentionned,memcpy的花费(无效*),而不是(字符*)

+0

@simonc:感谢编辑 – Flibustier

+2

不妨扔在'的memcpy(A + 0,&缬氨酸,1) “也是为了覆盖第三垒。 (我通常在*你的*常用的使用模式中使用*你的*第一个例子)。 – WhozCraig

+2

你是不是指'memcpy(&tab,&val,1)'? –

回答

10

memcpy的参数的类型void*,不char*的。指针类型的任何参数(不包括函数指针)都被隐式转换为void*。这是一个仅适用于void*的特殊情况规则。

鉴于申报

char tab[1]; 

要么tab&tab是作为一个参数memcpy有效。他们评估指针不同类型(char*char (*)[1]),但都指向相同的内存位置;转换为void*会得到相同的值。

对于实际需要参数char*的函数,只有tab有效; &tab是错误的类型。 (对于像printfscanf一个可变参数函数,编译器可能不能够检测到的类型不匹配。)

+1

对于char *和char(*)[1]为+1 +1 –

+0

一个big ** + 1 **(我希望我可以对它进行两次投票)来指出所得到的指针类型与他们的有效使用场景。 – WhozCraig

+0

我认为它完美地回答了我的问题。谢谢 ! – Flibustier