Эти утверждения о указателях имеют одинаковый эффект? - PullRequest
20 голосов
/ 19 января 2010

Делает это ...

char* myString = "hello";

... имеют такой же эффект?

char actualString[] = "hello";
char* myString = actualString;

Ответы [ 4 ]

33 голосов
/ 19 января 2010

номер

char  str1[] = "Hello world!"; //char-array on the stack; string can be changed
char* str2   = "Hello world!"; //char-array in the data-segment; it's READ-ONLY

Первый пример создает массив размером 13*sizeof(char) в стеке и копирует в него строку "Hello world!".
Второй пример создает char* в стеке и указывает его на местоположение в сегменте данных исполняемого файла, который содержит строку "Hello world!". Эта вторая строка READ-ONLY .

str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program!
4 голосов
/ 19 января 2010

Нет. Первый дает вам указатель на const данные, и если вы изменяете какой-либо символ с помощью этого указателя, это неопределенное поведение. Второй копирует символы в массив, который не const, так что вы можете изменять любые символы (либо непосредственно в массиве, либо через указатель) по своему усмотрению без вредных последствий.

3 голосов
/ 20 января 2010

Это не то же самое, потому что безымянный массив, на который указывает myString в первом примере, доступен только для чтения и имеет статическую продолжительность хранения, тогда как именованный массив во втором примере доступен для записи и имеет автоматическую продолжительность хранения.

С другой стороны, это ближе к эквиваленту:

static const char actualString[] = "hello";
char* myString = (char *)actualString;

Это все же не совсем то же самое, потому что неназванные массивы, созданные строковыми литералами, являютсяне гарантируется быть уникальным, тогда как явные массивы.Таким образом, в следующем примере:

static const char string_a[] = "hello";
static const char string_b[] = "hello";
const char *ptr_a = string_a;
const char *ptr_b = string_b;
const char *ptr_c = "hello";
const char *ptr_d = "hello";

ptr_a и ptr_b гарантированно сравнивают неравные значения, тогда как ptr_c и ptr_d могут быть равными или неравными - оба действительны.

3 голосов
/ 19 января 2010

Нет.В первом случае вы не можете изменить строку, указанную myString, во втором можете.Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...