Недавно я наткнулся на исходный код, где программист объявил переменные внутри одного бесконечного цикла в зависимости от , если/else условиях. То, что я нашел странным, - это то, что код работал, и это не подразумевало утечек памяти. Сначала я подумал, что, возможно, это была специфическая архитектура (код для ARM), но я провел несколько тестов, и я узнал, что двоичные файлы на IA32, скомпилированные с GCC, действуют одинаково.Переменные и выделение внутри цикла
Мой подход был таким: Я создал две небольшие программы foo.c и bar.c
Foo.c:
#include <stdio.h>
int main(void)
{
int i;
for(i=0; i<10; i++) {
char buf[10];
buf[i] = 0;
printf("buf[%d] (@ %#x) == %d\n", i, &buf, buf[i]);
}
return(0);
}
Bar.c:
#include <stdio.h>
int main(void)
{
int i;
for(i=0; i<10; i++) {
char *ptr;
ptr = (char *) malloc(10);
ptr[i] = 0;
printf("buf[%d] (@ %#x) == %d\n", i, &ptr, ptr[i]);
}
return(0);
}
Причиной явного различия между объявлением массива в Foo.c и выделением памяти в Bar.c было то, что f Сначала я подумал, что, возможно, компилятор автоматически определяет, что это одна и та же переменная, и просто игнорирует декларацию после начального для итерации, которая, конечно же, не должна быть в Bar.c, потому что я явно выделяю память.
Что было действительно странно для меня, что в обоих примерах адрес как массива, так и выделенной памяти остается неизменным после начального для итерации.
Я не совсем понимаю это, и у меня нет моей копии K & R со мной, поэтому я буду благодарен за объяснение. (Также, если я допустил какую-либо ошибку в своих рассуждениях, я был бы рад отметить это.)
C++ - это другой язык от C, не знаете? И 'return' не является функцией ... – Griwes
Tak, wiem. Czy Ty wiesz, ze to zachowanie jest na pewno zwiazane z kompilatorem i jestem prawie pewien, ze G ++ zachowa sie tutaj tak samo. Идентификатор Wiec C++ nie powinien zostac usuniety IMO. – andy
Во-первых, это английский сайт, поэтому пишите только на английском языке; факт, что я из Польши ничего не меняет. Во-вторых, вы пишете на C, а не на C++, поэтому тег C++ здесь неактуальен. – Griwes