2015-11-20 3 views
-1

Возможно ли printf адрес памяти первого элемента массива в C?Возможно ли напечатать адрес памяти первого элемента массива в C?

Компилятор выдает сообщение об ошибке при попытке:

printf("i%/n", @array[0]) 

Где я объявил array[] = {23, 56, 78}.

+2

В C, @ не обозначает массив. Прочтите основную книгу :) – SergeyA

+0

проверьте ссылку для ['printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf) –

+1

Ruby programmer? –

ответ

3
printf("i%/n", @array[0]) 

должен быть

printf("%p\n", (void*)&array[0]); 

Используйте спецификатор формата p для печати Адрес

5

ли вы попробовать:

printf("%p\n", (void*)array); 

?

+0

'% d' не является правильным спецификатором форматирования для указателя. – fuz

+0

Да, отредактировал его сразу. – Yuriko

+0

Технически вам также нужно преобразовать 'array' в' void * ', но исключение приведения отлично подходит для всех, кроме некоторых странных платформ. – fuz

2

%p Используйте форматирование спецификатор. Используйте & вместо @, чтобы получить адрес, хотя он является избыточным: &foo[0] равен foo, за исключением случаев, когда операнд sizeof. Технически, вы также должны привести указатель массива на void*, если это не указатель на символ (char*), в этом случае бросок не нужен:

printf("%p\n", (void*)array); 
+0

Не могли бы вы расшифровать «... если это не указатель на символ' (char *) '..."? Спецификация C11 говорит: «Аргумент должен быть указателем на« void ».» – chux

+0

@chux См. ISO 9899: 2011 §6.5.2.2 ¶6 # 2: * Если функция определена с типом, который не включает прототип, а типы аргументы после продвижения по службе несовместимы с аргументами параметров после продвижения по службе поведение не определено, за исключением следующих случаев: (...) оба типа являются указателями на квалифицированные или неквалифицированные версии типа символа или 'void'. * – fuz

+0

@chux Извините, неверная цитата. Правильный, конечно, §7.16.1.2 ¶2 # 2, который читается аналогично: * Если фактический следующий аргумент отсутствует или если тип несовместим с типом фактического следующего аргумента (в соответствии с аргументом по умолчанию рекламные акции), поведение не определено, за исключением следующих случаев: (...) один тип является указателем на 'void', а другой - указателем на тип символа. * – fuz

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