C ++, почему массив = ptr разрешен? - PullRequest
0 голосов
/ 02 октября 2010

Недавно я увидел этот кусок кода.Разве эта строка не должна быть ошибкой компиляции? char arr[4]="Abc";

Что здесь происходит?Arr указатель?char * копируется в массив в стеке?это законно во всех версиях C ++ (и как насчет C?).Я протестировал и увидел, что это работает в VS и кодовой панели, которая, как мне кажется, использует gcc

-edit- Просто для забавы я попытался заменить «Abc» на статический const char *.Это дало мне неверную ошибку инициализатора.

int main()
{
    int j=97;
    char arr[4]="Abc";
    printf(arr,j);
    getch();
    return 0;
}

Ответы [ 4 ]

8 голосов
/ 02 октября 2010

array = ptr не является допустимым назначением (если array имеет тип массива, а ptr имеет соответствующий тип указателя).Однако в приведенном вами коде = вводит инициализатор, поскольку он является частью объявления.Это не присваивание.

Допустимо инициализировать массив char строковой константой.

4 голосов
/ 02 октября 2010

Строковый литерал не является указателем. Строковый литерал является массивом символов. Итак, в вашем примере это array = array инициализация , а не array = pointer, как вы, кажется, верите.

Тем не менее в общем случае инициализация одного массива другим массивом, как на C, так и на C ++, действительно запрещена.

Однако и в C, и в C ++ есть одно исключение из этого правила: символьные массивы можно инициализировать строковыми литералами. (Примечание: инициализация разрешена; назначение не будет работать). Каждый элемент массива инициализируется с соответствующим символом из литерала (который также неявно включает завершающий нулевой символ в конце). В C ++ требуется, чтобы размер массива получателя имел достаточно места для завершающего нуля. В C допускается «выпадение» в конце нуля, если в массиве получателей не хватает одного символа.

Кроме того, вам не требуется явно указывать размер массива. Вы можете сделать

char arr[] = "Abc";

и компилятор автоматически определит, что вам нужен массив из 4 элементов.

3 голосов
/ 02 октября 2010

Это эквивалентно

char arr[4] = {'A', 'b', 'c', 0};

, что в свою очередь эквивалентно:

char arr[4];
arr[0] = 'A';
arr[1] = 'b';
arr[2] = 'c';
arr[3] = 0;
1 голос
/ 02 октября 2010

Массивы символов могут быть инициализированы строковыми литералами, он просто назначает каждый элемент символ за символом Это просто языковая функция.


И нет, arr не является указателем. Это массив. "Abc" - это строковый литерал, который также является символьным массивом.

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