2017-01-24 2 views
0

code linkмассива во время выполнения

#include <stdio.h> 

int main(void) { 
    // your code goes here 
    int a = 2; 
    int b = 3; 
    int c; 
    c = a + b; 
    int arr[c]; 
    arr[5] = 0; 
    printf("%d",arr[5]); 
    return 0; 
} 

Выход 0

Как это то, что во время выполнения он принимает номер массива? Это новая функция?

+2

Является ли функция добавленной в прошлом веке «новой»? –

+0

Это потому, что вы уже инициализировали его? потому что если вы делаете что-то вроде printf («% d», arr [4]); вы получите ошибку –

ответ

1

Эта функция (Массив переменной длины) была представлена ​​в C99. Но в настоящее время это по-прежнему является зависимым от компилятора. Некоторый компилятор (например, gcc) поддерживает его. Некоторые (например, msvc) этого не делают.

BTW, arr[5] в вашем коде, находится за пределами допустимого диапазона. Последний элемент должен быть arr[4].

+1

Это стандартная C. Не расширение (хотя оно зависит от компилятора, так как Microsoft была очень медленной, чтобы реализовать C99) – StoryTeller

+0

@StoryTeller Я не знал об этом. Я сделал некоторые копания после просмотра вашего комментария и обновления ссылки в моем ответе. :-) –

3

Это массив переменной длины. Они были введены в 1999 году в редакции стандарта C.

К сожалению, поддержка для них пришла медленно, настолько, что ревизия 2011 года сделала их необязательной функцией (но они по-прежнему стандартизированы) .

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


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

+0

Причиной сделать это необязательным является то, что «поддержка для них приходила медленно»? Любая ссылка? –

+0

@ P.P. - Это чувство, которое я чувствую. Некоторые поставщики компиляторов были устойчивы, поэтому их было необязательно утихать. Об этом в Майкрософт. – StoryTeller

-1

не следует путать в (статический/фиксированное распределение памяти) & (динамическое выделение памяти) понятий :)

Позвольте мне ясно, ваша концепция братан.

Относится к следующему вопросу,

      C supports two type of array. 

1. Статический массив - выделяется память в "COMPILE TIME".

2. Динамический массив - выделяется память при «RUN TIME».

Ques. Как определить, является ли массив статическим или динамическим?

Ans. Объявление массива Синтаксис: -

  int array_Name[size];  //size defines the size of block of memory for an array; 

Итак, подходит к точке ->

Точка 1. если размер задан во время компиляции массива, это «Статическое распределение памяти». Он также называется «выделение памяти фиксированного размера», поскольку размер никогда не изменяется. Это ОГРАНИЧЕНИЕ МАССЫ в C.

ex. int arr[10]; //10 is size of arr which is staticly defined int brr[] = {1000, 2, 37, 755, 3}; //size is equal to the no. of values initilizes with.

пункт 2. Если во время компиляции задан размер массива, это динамическое распределение памяти. Это достигается функцией malloc(), определенной в stdlib.h.

Теперь его это уточнение кода: -

#include <stdio.h> 

    int main(void) { 
     // your code goes here 
     int a = 2; 
     int b = 3; 
     int c; 
     c = a + b;    //c is calculated at run time 
     int arr[c];   //Compilor awaiting for the value of c which is given at run time but, 
     arr[5] = 0;   //here arr is allocated the size of 5 at static(compile) time which is never be change further whether it is compile time in next statements or run time. 
     printf("%d",arr[5]); 
     return 0; 
    } 

Таким образом, массив (размер 5) имеет значение 0 при обр [5].
и другие индексы массива по-прежнему отображают значения мусора.

Надеясь, вы будете удовлетворены этим решением своей проблемы :)

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