programing

구조 객체가 없는 C 포인터 산술

megabox 2023. 9. 11. 21:34
반응형

구조 객체가 없는 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바이트만 소요됨), 저는 흥미로운 케이스입니다.

오프셋을 사용하면 해당 유형의 변수를 잡을 필요 없이 멤버 간에 계산을 수행할 수 있습니다.종류 자체와 멤버 이름만 있으면 됩니다.

일반적인 계산이 잘 안 되는 이유를 기록합니다. 데이터 정렬입니다.컴파일러가 구조를 변경하면 매우 미묘한 오류를 초래하거나 겉보기에는 정확한 계산을 잘못할 수 있습니다.

우선, 당신은 개인적인 주소를ints. 별로 좋은 생각은 아닌 것 같아요.int크기가 최소 2바이트 이상이어야 하며, 주소/주소는 일반적으로 4 또는 8바이트입니다.이들을 지정합니다.int제대로 앉지 못할 뿐입니다.만약 내가 그들을 어떤 것에 캐스팅 한다면, 나는 아마unsigned long32비트 시스템의 경우,unsigned long long64비트.안전을 위해서는 후자를 이용하고 싶습니다.
그건 그렇지만, 주소는 아예 안 캐스트하고 그냥 사용할 거예요.offsetof거시적인

더하다#include <stddef.h>당신의 파일에, 그리고 사용합니다.offsetof간격띄우기 값을 다음으로 캐스트하는 매크로size_t활자가 아닌int, 네 말을 들으라.0을 구조물의 메모리 주소로 사용하여 간단히 작동한 다음, 주어진 부재의 주소를 반환하여 실제 오프셋을 제공합니다.

size_t offset = offsetoff(T1, c);
                    //struct, member

잭이 그의 논평에서 지적했듯이, 답변의 다음 부분은 다소 관련이 없지만, 그것이 포함하고 있는 링크를 위해, 그리고 완성도를 위해, 저는 여기에 그것을 그냥 두겠습니다 -offsetof모든 구현에 필요합니다.

어떤 이유에서인지 stddef.h가 없다면 매크로를 직접 정의합니다.offsetofC89 이상)은 한동안 표준에 포함되어 있었습니다.

#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

반응형