2013-11-12 2 views
1

мне нужно знать расстояние памяти между двумя подструктурамитипа разницы указателя (минус)

(&my_type.a - &my_tape.b.c) 

Каким типом результата? Мне нужно отбросить его до (signed int), так что, очевидно, это что-то еще.

+0

Пожалуйста, отметьте вопрос на соответствующем языке. Это D, Go или C#? –

+0

Если вас интересует, тот же вопрос в fortran с iso_c_bindings: http://stackoverflow.com/questions/19926504/diffptr-t-fortran-with-iso-c-bindings – user2885778

ответ

0

Во-первых, вы не можете принимать адреса членов типов. Если my_type является именем типа, то &my_type.a не является допустимым выражением. Сначала вам нужен объект типа. Например, вы можете использовать my_type foo; (&foo.a - &foo.b.c).

Во-вторых, если a и c не являются символьными типами, то результат &foo.a - &foo.b.c не определяется стандартом C, даже если они одного типа. Стандарт C определяет результат вычитания указателей, только если они являются указателями на элементы в одном и том же объекте массива или один за последним элементом объекта массива. (С этой целью один элемент ведет себя как массив из одного элемента.)

Вы можете получить определенный результат путем преобразования указателей к типу символов:

my_type foo; 
(char *) &foo.a - (char *) &foo.b.c 

Результат этого выражения имеет тип ptrdiff_t. Он определяется, потому что весь объект foo может рассматриваться как массив из char, поэтому указатели на байты внутри него могут быть вычтены.

1

Вы можете использовать size_t для этого (что часто неподписанных Int) Если вам нужно было подписано использовать ssize_t см What is size_t in C?

Edit: Вы, вероятно, следует использовать ptrdiff_t для этого см http://www.viva64.com/en/a/0050/

+0

Спасибо, но size_t не знаком, и мне нужен родственник расстояние ... – user2885778

+1

@ user2885778, то используйте ssize_t, который является подписанным size_t! – Antzi

+0

Я вижу, я также могу использовать ptrdiff_t. – user2885778

6

По стандарт C11, §6.5.6/9,

При вычитании двух указателей ... Размер результата определяется реализацией и его тип (целочисленный тип со знаком) равен ptrdiff_t, определенному в заголовке <stddef.h>.

+0

Я думаю, что действительно запутанная проблема здесь, которую OP может обнаружить позже после отправки продукта, заключается в том, что ее исходное выражение вычисляет * количество элементов * в диапазоне, а не в количестве * байтов *. –

+0

В любом случае, здесь это правильный ответ на вопрос, а не тот, который был принят. –

+0

Как это может быть «количество элементов в диапазоне», когда речь идет о двух разных структурах (двух разных типов)? – user2885778

Смежные вопросы