Это...
char* myString = "hello";
... имеют тот же эффект, что и этот?
char actualString[] = "hello";
char* myString = actualString;
Это...
char* myString = "hello";
... имеют тот же эффект, что и этот?
char actualString[] = "hello";
char* myString = actualString;
Нет.
char str1[] = "Hello world!"; //char-array on the stack; string can be changed
char* str2 = "Hello world!"; //char-array in the data-segment; it READ-ONLY
Первый пример создает массив размера 13*sizeof(char)
в стеке и копирует в него строку "Hello world!"
.
Второй пример создает char*
в стеке и указывает его на местоположение в сегменте данных исполняемого файла, который содержит строку "Hello world!"
. Эта вторая строка READ-ONLY.
str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program!
Нет. Первый дает вам указатель на данные const
, и если вы меняете любой символ с помощью этого указателя, это поведение undefined. Вторая копирует символы в массив, который не является const
, поэтому вы можете изменять любые символы (либо непосредственно в массиве, либо через указатель) без каких-либо вредных эффектов.
Нет. В первом случае вы не можете изменить строку, указанную myString
, во второй, которую вы можете. Подробнее здесь.
Это не то же самое, потому что неназванный массив, на который указывает 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
могут быть либо равными, либо неравными - оба действительны.