40

我想将硬编码的 char 数组作为source参数传递给 memcpy ... 像这样:

memcpy(dest, {0xE3,0x83,0xA2,0xA4,0xCB} ,5);

用 clang 编译会出现以下错误:

cccc.c:28:14: error: expected expression

如果我将其修改为(请参阅额外的括号):

memcpy(dest,({0xAB,0x13,0xF9,0x93,0xB5}),5);

clang给出的错误是:

cccc.c:26:14: warning: incompatible integer to pointer
              conversion passing 'int' to parameter of
              type 'const void *' [-Wint-conversion]

cccc.c:28:40: error: expected ';' after expression
memcpy(c+110,({0xAB,0x13,0xF9,0x93,0xB5}),5);

所以,问题:

如何传入硬编码数组作为memcpyhttp://www.cplusplus.com/reference/cstring/memcpy/)的源参数

我努力了:

(void*)(&{0xAB,0x13,0xF9,0x93,0xB5}[0])  - syntax error
{0xAB,0x13,0xF9,0x93,0xB5}               - syntax error
({0xAB,0x13,0xF9,0x93,0xB5})             - see above
(char[])({0xE3,0x83,0xA2,0xA4,0xCB})     - error: cast to incomplete type 'char []' (clang)

还有一些更疯狂的组合,我很惭愧在这里写...

请记住:我不想创建一个新变量来保存数组。

4

4 回答 4

44

如果您使用 C99 或更高版本,则可以使用复合文字。( N1256 6.5.2.5)

#include <stdio.h>
#include <string.h>
int main(void){
    char dest[5] = {0};
    memcpy(dest, (char[]){0xE3,0x83,0xA2,0xA4,0xCB} ,5);
    for (int i = 0; i < 5; i++) printf("%X ", (unsigned int)(unsigned char)dest[i]);
    putchar('\n');
    return 0;
}

更新:这适用于 GCC 上的 C++03 和 C++11,但被-pedantic-errors选项拒绝。这意味着这不是标准 C++ 的有效解决方案。

#include <cstdio>
#include <cstring>
int main(void){
    char dest[5] = {0};
    memcpy(dest, (const char[]){(char)0xE3,(char)0x83,(char)0xA2,(char)0xA4,(char)0xCB} ,5);
    for (int i = 0; i < 5; i++) printf("%X ", (unsigned int)(unsigned char)dest[i]);
    putchar('\n');
    return 0;
}

要点是:

  • 将数组设为 const,否则取临时数组的地址将被拒绝。
  • 将数字强制转换为char显式,否则缩小转换将被拒绝。
于 2016-03-02T11:18:35.210 回答
25

您可以只发送一个字符串作为参数。它似乎编译得很好。

#include <iostream>
#include <string.h>
using namespace std;

int main() {
    char dest[6] = {0};
    memcpy(dest,"\XAB\x13\XF9\X93\XB5", 5);

    return 0;
}
于 2016-03-02T11:22:00.213 回答
20

最好的解决方案是根本不这样做,而是使用临时变量:

const char src[] = {0xE3,0x83,0xA2,0xA4,0xCB};
memcpy(dest, src, sizeof(src));

该代码是最易于维护的,因为它不包含“幻数”,因此它不会像复合文字版本那样包含任何缺少的数组项或数组越界错误。

此代码还与 C++ 和 C90 兼容。

这里最重要的是要意识到生成的机器代码无论如何都是相同的。不要认为您正在使用复合文字进行任何形式的优化。

于 2016-03-02T12:09:45.867 回答
11

您可以使用复合文字

int main()
{
    unsigned char dest[5];
    size_t i;

    memcpy(dest, (unsigned char[]){0xE3,0x83,0xA2,0xA4,0xCB} ,5);

    printf("Test: " );
    for(i=0; i<sizeof(dest)/sizeof(dest[0]); i++)
        printf("%02X - ", dest[i] );
    printf("\n");
    return 0;
}
于 2016-03-02T11:20:44.117 回答