Я подозреваю, что у вас есть строковая структура:
struct string {
int length;
int somethingelse; /* thanks alok */
char *str;
}
а эта функция пытается получить доступ к полю длины при указателе на строку? Я прав? Я предполагаю, что именно это проверяет isOurs (чтобы убедиться, что это не какая-то старая строка). В этом случае вы хотите это:
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;
}
Но в идеале вы бы этого не делали. Это не портативный или ремонтопригодный. Что произойдет, если компилятор вставит отступ, о котором вы не знаете? Стандарт C99 гласит, что он не будет помещать отступ между массивом размером 0 и предыдущим полем, но ничто не помешает ему сходить с ума от других (например, если у вас есть смесь типов).
Что произойдет, если кто-то придет позже и вставит больше данных в структуру? Естественно, они должны были бы поместить это перед полем str, поскольку «структура взломать» работает, имея его в конце. В идеале для этого следует использовать offsetof (), который является стандартным макросом. Alok предлагает лучшее решение здесь и
Интерпретация уродливого макроса (всего 1 строка)
edit (кажется, что за 2 минуты мне потребовалось набрать этот последний последний абзац, ответ Alok на offsetof () был принят поверх этого;))