programing

배열을 memcpy 매개 변수로 코드화

oldcodes 2023. 9. 1. 21:19
반응형

배열을 memcpy 매개 변수로 코드화

하드코드된 문자 배열을 다음과 같이 전달하고 싶습니다.sourcememcpy에 대한 매개 변수...이와 같은 것:

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);

자, 질문은 다음과 같습니다.

하드코딩된 배열을 소스 매개 변수로 전달하는 방법은 무엇입니까?memcpy(http://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)

그리고 여기에 쓰기 창피한 더 이상의 미친 조합들...

다음 사항을 기억하십시오.배열을 유지할 새 변수를 생성하지 않습니다.

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;
}

점:

  • 배열을 상수로 설정합니다. 그렇지 않으면 임시 배열의 주소 지정이 거부됩니다.
  • 번호를 던져주기char명시적으로 그렇지 않으면 축소 변환이 거부됩니다.

문자열을 매개 변수로 보낼 수 있습니다.컴파일이 잘 된 것 같습니다.

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

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

    return 0;
}

가장 좋은 해결책은 이 작업을 전혀 수행하지 않고 임시 변수를 사용하는 것입니다.

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

이 코드는 "마법적 숫자"를 포함하지 않기 때문에 복합 리터럴 버전처럼 누락된 배열 항목이나 배열 아웃바운드 버그를 포함하지 않기 때문에 가장 유지 관리가 가능합니다.

이 코드는 C++ 및 C90과도 호환됩니다.

여기서 가장 중요한 것은 생성된 기계 코드가 어차피 동일할 것이라는 것을 깨닫는 것입니다.복합 리터럴을 사용하여 어떤 형태로든 최적화를 수행하고 있다고 생각하지 마십시오.

복합 리터럴을 사용할 수 있습니다.

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;
}

언급URL : https://stackoverflow.com/questions/35745385/c-hardcoded-array-as-memcpy-parameter

반응형