구조 객체가 없는 C 포인터 산술
C에서는 불가능할 것 같은데 확인 부탁드립니다.이 유형의 실수 변수 없이 구조 부재 간의 연산이 가능합니까?예를 들어,
typedef struct _s1
{
int a;
int b;
int c;
} T1;
구조 시작 대비 c 부재의 오프셋을 보고 싶습니다.변수가 있으면 쉽습니다.
T1 str;
int dist = (int)&str.c - (int)&str;
하지만 제 구조가 너무 커서 RAM에 멤버가 없습니다(EPROM에서만). 그리고 주소 계산을 좀 하고 싶은데 RAM 멤버를 정의하지 않고 RAM 멤버를 정의하지 않습니다.구조 변수 대신 구조 포인터로 작업할 수 있지만(4바이트만 소요됨), 저는 흥미로운 케이스입니다.
오프셋을 사용하면 해당 유형의 변수를 잡을 필요 없이 멤버 간에 계산을 수행할 수 있습니다.종류 자체와 멤버 이름만 있으면 됩니다.
일반적인 계산이 잘 안 되는 이유를 기록합니다. 데이터 정렬입니다.컴파일러가 구조를 변경하면 매우 미묘한 오류를 초래하거나 겉보기에는 정확한 계산을 잘못할 수 있습니다.
우선, 당신은 개인적인 주소를int
s. 별로 좋은 생각은 아닌 것 같아요.int
크기가 최소 2바이트 이상이어야 하며, 주소/주소는 일반적으로 4 또는 8바이트입니다.이들을 지정합니다.int
제대로 앉지 못할 뿐입니다.만약 내가 그들을 어떤 것에 캐스팅 한다면, 나는 아마unsigned long
32비트 시스템의 경우,unsigned long long
64비트.안전을 위해서는 후자를 이용하고 싶습니다.
그건 그렇지만, 주소는 아예 안 캐스트하고 그냥 사용할 거예요.offsetof
거시적인
더하다#include <stddef.h>
당신의 파일에, 그리고 사용합니다.offsetof
간격띄우기 값을 다음으로 캐스트하는 매크로size_t
활자가 아닌int
, 네 말을 들으라.0을 구조물의 메모리 주소로 사용하여 간단히 작동한 다음, 주어진 부재의 주소를 반환하여 실제 오프셋을 제공합니다.
size_t offset = offsetoff(T1, c);
//struct, member
잭이 그의 논평에서 지적했듯이, 답변의 다음 부분은 다소 관련이 없지만, 그것이 포함하고 있는 링크를 위해, 그리고 완성도를 위해, 저는 여기에 그것을 그냥 두겠습니다 -offsetof
모든 구현에 필요합니다.
어떤 이유에서인지 stddef.h가 없다면 매크로를 직접 정의합니다.offsetof
C89 이상)은 한동안 표준에 포함되어 있었습니다.
#ifndef offsetof
#define offsetof(s, m) ((size_t)&(((s *) 0)->m))
#endif
이는 효과가 있어야 하지만 주의해야 합니다. 이 구현은 정의되지 않은 행동을 야기할 수 있습니다.여기서 설명하는 방법과 이유
제가 가져갔습니다.offsetof
여기서 찾은 stddef.h source에서 위의 정의는, 당신은 당신의 파일에 매크로를 정의하는 대신에, 당신은 단지 그 파일을 다운로드하고, 그것을 사용할 수 있지만, 당신의 파일에 매크로를 정의하는 대신에, 그러나 기억할 것입니다.offsetof
당신이 사용하는 것은 100% 신뢰할 수 없습니다.
어쨌든 구글에 대한 더 많은 정보는 지금으로서는 충분하지만, 여기 몇 개의 링크가 있습니다.
에서 정의된 를 사용할 수 있습니다.
요청한 것이라는 만, 한 로운 사용법이 있습니다. 하지만 한가지 흥미로운 용도가 있습니다.offsetof
를어널서다스다서d널r어를e스e,n .container_of
거시적인container_of
중 포인터가 주어지면 상위 구조의 주소를 반환할 수 있습니다.
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
예를 들어 다음과 같이 사용할 수 있습니다.
// pointer_to_c points to a member of the struct, c in this case
// and you want to get the address of the container
T1 *container;
container = container_of(pointer_to_c, T1, c);
stddef.h
는 구조의 처음부터 멤버의 오프셋을 제공하는 오프셋이라는 매크로를 가지고 있습니다.
size_t t = offsetof( T1 , c ) ;
이렇게 하면 실제로 구조 변수를 선언할 필요가 없습니다.
맞습니다.
size_t dist = offsetof(struct _s1, c);
stddef.h
매크로가 있습니다; . 이 매크로를 구조물에 사용할 수 있습니다:
int dist = (int)offsetof(T1, c);
언급URL : https://stackoverflow.com/questions/21455365/c-pointer-arithmetic-without-object-of-structure
'programing' 카테고리의 다른 글
경로가 PowerShell의 폴더 또는 파일인지 확인 (0) | 2023.09.11 |
---|---|
C와 C++의 Float와 Double의 크기는 어떻게 됩니까? (0) | 2023.09.11 |
데이터 프레임의 두 열을 명명된 벡터로 변환 (0) | 2023.09.11 |
Angular App은 새 배포 후 캐시를 삭제해야 함 (0) | 2023.09.11 |
mysql의 날짜별 데이터에서 월별 행 수 가져오기 (0) | 2023.09.11 |