переменный адрес char * против char [] адрес переменной - PullRequest
2 голосов
/ 05 декабря 2010

Я распечатываю адреса и строки из следующих двух объявлений и инициализаций:

  char * strPtr = (char *) "This is a string, made on the fly.";
  char charArray [] = "Chars in a char array variable.";

При выводе следующий вывод происходит с совершенно разными адресами для переменных charArray и strPtr. Вопрос: «Почему?»

Печать:

  printf( "%10s%40s%20p\n", "strPtr", strPtr, &(*strPtr));    
  printf( "%10s%40s%20p\n", "charArray", charArray, charArray);

Выход:

    strPtr      This is a string, made on the fly.            0x400880    
 charArray         Chars in a char array variable.      0x7fff12d5ed30

Как видите, разные адреса: 0x400880 против 0x7fff12d5ed30

Остальная часть объявленной ранее переменной имеет адреса, подобные charArray.

Опять же, вопрос в том, почему адреса такие разные? Спасибо за любую помощь.

Ответы [ 5 ]

4 голосов
/ 05 декабря 2010

Потому что строковые литералы, например «foo bar» размещается в «другом месте», чем ваш массив символов.

Это зависит от реализации , но типичная реализация помещает строковые литералы в ваш .rdata («данные только для чтения») вашего исполняемого файла, а ваш массив char объявляется локально, и, следовательно, идет в стек.

И при загрузке в ОЗУ различные разделы вашего изображения будут сопоставляться с совершенно разными адресами.

3 голосов
/ 05 декабря 2010

Я предполагаю, что компилятор / компоновщик помещает массив символов в стек, тогда как другая строка помещается в таблицу статических строк.

2 голосов
/ 05 декабря 2010

Вот как это происходит - я помню, как читал об этом в [ Unix: системное программирование ]

1 alt text

Как видите, инициализированные статические данные хранятся в другом месте в куче, в отличие от неинициализированных статических данных.

2 голосов
/ 05 декабря 2010

Текст "Символы в переменной массива символов".и «Это строка, сделанная на лету».вероятно, довольно близко друг к другу.Однако char charArray[] = ... запрашивает пространство в стеке, в которое копируется соответствующий бит текста.Стек практически отличается от исходного жестко закодированного текста, как только ОС завершит свою виртуализацию и т. Д.

1 голос
/ 06 декабря 2010

Здесь важно понять, что в случае strPtr вы имеете дело с двумя различными объектами, тогда как в случае charArray вы имеете дело только с один .

charArray - это один объект массива, заполненный символами строки "Chars in a char array variable.".

strPtr сам по себе является одним указателем объекта. Его значением является адрес второго анонимного неизменяемого объекта массива, который, в свою очередь, содержит символы строки "This is a string, made on the fly.".

Когда вы печатаете charArray с использованием %p, вы печатаете адрес charArray[0] (из-за специального правила для массивов). Когда вы печатаете &(*strPtr) (что в точности совпадает с strPtr), вы печатаете адрес анонимного, неизменяемого объекта массива, упомянутого ранее, и именно поэтому он кажется настолько отличным от адресов других переменных участие.

Если вы напечатаете &strPtr с использованием %p, вы увидите, что адрес самой переменной strPtr находится в диапазоне, аналогичном другим локальным переменным.

...