2013-09-08 2 views
1
char arr1 [0]; 
arr1[50] = 'A'; 

char arr2 [0] = {1, 1, 1, 1, 1}; //gives compiler warning 

Зачем использовать вышеприведенную компиляцию?Объявление размера массива C означает ничего?

И как только второе дает мне предупреждение?

+2

one - это объявление, другое - ошибка времени выполнения. (В обратном порядке, очевидно) –

+2

Во-первых, вы используете компилятор, который поддерживает массивы нулевой длины в качестве расширения, так как он не является частью стандарта и не сработает с какой-либо строкой, соответствующей стандартным стандартам. Решение 50-го элемента массива нулевой длины - это язык C, позволяющий инженеру стрелять в ногу с неопределенным поведением. Это действительно так просто. Во-вторых, предупреждение (слишком много значений в инициализаторе) скорее говорит и должно быть включено как часть вопроса, как всегда. И как следствие этого, «компилировать нормально» кажется несколько неточным. – WhozCraig

ответ

0

"char arr2 [0] = {1, 1, 1, 1, 1};" даст вам ошибку, так как вы объявляете arr2 как массив нулевого элемента и инициализируете его 5 элементами. Скорее всего, компилятор будет жаловаться/предупреждать вас о наличии лишних элементов в инициализаторе массива. Вы можете либо «char arr2 [] = {1, 1, 1, 1, 1};» и C будет неявно вывести из памяти или вы можете явно указать количество элементов: "char arr2 [5] = {1, 1, 1, 1, 1};"

Кроме того, "arr1 [50] = 'A';" это плохая идея, когда вы обрабатываете arr1 как массив нулевого размера: «char arr1 [0];». Просто объявите его так, чтобы он мог иметь достаточно элементов для включения значения, которое вы добавляете с индексом 50.

1

Первый компилируется обычно, поскольку компилятор обычно не понимает, что a[50] = 0 пытается присвоить значение вне выделенного массива Память. Поведение во время выполнения не определено: может произойти сбой, прекратить работу программы, форматировать жесткий диск или вообще ничего не делать.

Второй предупреждает, потому что инициализатор массива справа не соответствует объявлению массива слева. Это было бы похоже на запись int x = "a string".

1

Оба заявления должны дать вам ошибку во время компиляции, поскольку объявляя массив длины 0 является «ограничением нарушения» типа ошибки, что любой компилятор сусла захвата, если он соответствует стандарту C.

char arr2 [0] = {1, 1, 1, 1, 1}; 

Имеет дополнительное нарушение ограничений, а именно, что в массиве больше инициализаторов, чем элементов массива. Кажется, ваш компилятор захватил это.

В отличие от этого

arr1[50] = 'A'; 

просто запустить поведение во времени, что не определено стандартом и компилятор может сделать что-нибудь, что заблагорассудится с ним. Хороший компилятор также может легко обнаружить это.

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

Смежные вопросы