나는이 같은 문자열 구조체가 의심 :
struct string {
int length;
int somethingelse; /* thanks alok */
char *str;
}
을이 기능은 STR에 대한 포인터를 제공 할 때 길이 필드에 액세스하려고? 나 맞아? 이것이 isOur가 (이전의 문자열이 아닌지) 확인하는 것입니다.
length = (*((int*)(src - 2))) * sizeof(int);
int utstrlen(char* src){
int length=0 ;
if(isOurs(src) ==1){
length = *((int*)(src - (2 * sizeof(int)))); /* from str moveback 2 ints worth*/
}
else {
//return strlen(src) ?
}
return length;
}
을하지만 이상적으로 당신은 그렇게 할 wouldn'd : 어떤 경우에, 당신이 원하는. 휴대용 또는 유지 보수가 불가능합니다. 컴파일러에서 모르는 패딩을 삽입하면 어떻게됩니까?C99 표준은 0 크기의 배열과 이전 필드 사이에 패딩을 넣지 않겠지 만, 다른 필드와는 화를 낼 수 없습니다 (예 : 유형이 혼합 된 경우).
나중에 누군가가 따라 와서 더 많은 데이터를 구조에 삽입하면 어떻게됩니까? 당연히, 'struct hack'은 마지막에 그것을 가짐으로써 작동하므로, 필드 str 앞에 붙여야합니다. 이상적으로 표준 매크로 인 offsetof()를 사용해야합니다. 알록 더 나은 여기에 솔루션 Ugly Macro Interpretation (just 1 line)
편집 (그것이 그 새 마지막 단락을 입력 데려 2 분 같다, 알록의을 offsetof() 답이 하나 이상 받아 들여졌다를) 제공)
출처
2010-01-10 23:55:39
Pod
수량 또는 길이가 아닌 해당 행의 포인터를 계산 중입니다. 의사 코드 또는 길이에 대한 설명을 제공 할 수 있습니까? –