배열을 memcpy 매개 변수로 코드화
하드코드된 문자 배열을 다음과 같이 전달하고 싶습니다.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);
자, 질문은 다음과 같습니다.
하드코딩된 배열을 소스 매개 변수로 전달하는 방법은 무엇입니까?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
'programing' 카테고리의 다른 글
JavaScript를 통해 AJAX 요청에서 가져온 JSON 응답 구문 분석 (0) | 2023.09.01 |
---|---|
Recycler View에서 WRAP_CONTENT를 작동시키는 방법 (0) | 2023.09.01 |
동일한 표에서 두 개의 증분 열 (0) | 2023.09.01 |
자바스크립트 분산 컴퓨팅 (0) | 2023.09.01 |
jQuery를 사용하여 선택 목록의 옵션 숨기기 (0) | 2023.09.01 |