Инициализатор литеральной строки для символьного массива

В следующих правилах для случая, когда массив затухает к указателю:

lvalue [видит вопрос 2.5] типа array-of-T, который появляется в затуханиях выражения (за тремя исключениями) в указатель на его первый элемент; тип результирующего указателя является pointer-to-T.

(Исключения - когда массив является операндом sizeof или и оператор или является инициализатором литеральной строки для символьного массива.)

Как понять случай, когда массив является "инициализатором литеральной строки для символьного массива"? Некоторый пример.

Спасибо!

34
задан Prasoon Saurav 10 January 2010 в 14:53
поделиться

4 ответа

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

Исключение 1. - Когда массив является операндом размера.

int main()
{
   int a[10];
   printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */

   int* p = a;
   printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}

Исключение 2. - Когда массив является операндом оператора &.

int main()
{
    int a[10];
    printf("%p", (void*)(&a)); /* prints the array's address */

    int* p = a;
    printf("%p", (void*)(&p)); /*prints the pointer's address */
}

Исключение 3. - Когда массив инициализируется строкой литерала.

int main()
{
    char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */

    char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}
48
ответ дан 27 November 2019 в 16:44
поделиться

Это инициализатор строки букв для символьного массива:

char arr[] = "literal string initializer";

Может быть также:

char* str = "literal string initializer";

Определение из K&R2:

Строковый литерал, также называемый строкой постоянная, это последовательность символов окружённый двойными кавычками, как в "...". Строка имеет тип ``массив''. статический класс хранения символов (см. пункт А.3 ниже) и инициализирована с заданными символами. Будет ли различные строковые литералы определяется реализацией, и поведение программы, которая пытается изменить строковый литерал не определено.

5
ответ дан 27 November 2019 в 16:44
поделиться

Похоже, вы вытащили эту цитату из FAQ COMP.LANG.C (может быть, старая версия или, возможно, напечатанная версия; это не совсем совпадает с текущим состоянием онлайн):

http: //c-faq.com/aryptr/aryptrequiv.html

the Соответствующее разделение ссылок на другие разделы FAQ для разработки этих исключений. В вашем случае вы должны посмотреть:

http://c-faq.com/decl/strlitinit.html

2
ответ дан 27 November 2019 в 16:44
поделиться

Этот регекс идеально подходит для меня.

^([ \u00c0-\u01ffa-zA-Z'\-])+$

Это хорошо работает в php-средах с использованием preg_match (), но не везде.

Он соответствует Jérémie O'Co-nor , поэтому я думаю, что он соответствует всем UTF-8 именам.

-121--1543627-

Если вы не можете поместить дракона в A, вам потребуется создать другую таблицу и другую таблицу ссылок. Проблема заключается в создании уникального набора данных, которые необходимо сохранить (другая таблица), который не может быть таким же набором, как A. Так как это не тот же набор, вы больше не можете использовать таблицу связей (AtoB), который имеет внешние ключи, гарантирующие, что ссылка является ссылкой из набора A. Таким образом, можно создать следующие таблицы:

imaginary _ creatures

  • id
  • name

imaginary _ creatures _ to _ b

  • imaginary _ creatures _ id (ссылка на таблицу imaginary_creatures)
  • b _ id (ссылка на таблицу зоопарков)

Позже, когда вы хотите получить всех существ в зоопарке, вы можете сделать UNION

SELECT A.Name FROM A where A.ID IN 
   (SELECT AB.A_ID FROM AtoB AB WHERE B_ID = 
      (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))
UNION
SELECT i.name FROM imaginary_creatures i i.id IN 
   (SELECT ic.imaginary_creatures_id FROM imaginary_creatures_to_c ic 
    WHERE ic.b_id = (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))

Возможно, есть лучший способ написать это, но это

-121--4180476-

Предположим, что объявления

char foo[] = "This is a test";
char *bar  = "This is a test";

В обоих случаях типом строкового литерала « Это тест » является «15-элементный массив символов». В большинстве случаев выражения массива неявно преобразуются из типа «N-element array of T» в «pointer to T», и выражение вычисляется по адресу первого элемента массива. В объявлении для bar именно это и происходит.

Однако в объявлении для foo выражение используется для инициализации содержимого другого массива и поэтому не преобразуется в тип указателя; вместо этого содержимое строкового литерала копируется в foo .

8
ответ дан 27 November 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: