Порядок переменных в памяти
Влияет ли порядок объявления переменных в коде на то, в каком порядке и где им выделяет память компилятор? Например, у меня password_buffer и auth_flag не меняют своё местоположение, если я изменю их положение в коде:
1 вариант
int check_authentication(char *password) {
char password_buffer[16];
int auth_flag = 0;
strcpy(password_buffer, password);
if (strcmp(password_buffer, "brilling") == 0)
auth_flag = 1;
if (strcmp(password_buffer, "outgrade") == 0)
auth_flag = 1;
return auth_flag;
}
2 вариант
int check_authentication(char *password) {
int auth_flag = 0;
char password_buffer[16];
strcpy(password_buffer, password);
if (strcmp(password_buffer, "brilling") == 0)
auth_flag = 1;
if (strcmp(password_buffer, "outgrade") == 0)
auth_flag = 1;
return auth_flag;
}
Ответы (1 шт):
Локальные переменные по умолчанию имеют автоматический класс хранения. Т.е.
auto int auth_flag = 0;
для вашего кода компилятор gcc решил, что правильнее хранить эту переменную в регистрах, то-есть так :
register int auth_flag = 0;
А массивы в Си всегда должны храниться в памяти, то есть в стеке. И компилятор отнял у регистра SP (Stack Pointer) 16 байт.
Дальше переменные с плавающей запятой компилятору удобнее хранить в математических регистрах процессора. А их у него очень много. И у них нет адреса вообще, только имя.
При входе в функцию для тех переменных, которым компилятор решил выделить место в стеке он им выделяет один раз память для всех. А вопрос, кто выше/ниже не имеет ответа, это не имеет значения.
Пример, где порядок имеет значение, это объявление структуры. Так как это тип, у него должно быть фиксированное место элементов и в том порядке, что и расписано.