umbriel> Вот у тебя же есть gcc, тоже можешь проверить
Проверяем.
Компиляция без флагов оптимизации и прочего:
$ gcc calcul.c -o result
Исходный код calcul.c
code text
#include <stdio.h>
int a;
double b;
int main(void){
printf ("address of a is %d a=%d\\taddress of b is %d b=%f\\n",&a,a,&b,b );
return 0;
}
Многократно запускаем result:
code text
$ ./result
address of a is 134520864 a=0 address of b is 134520872 b=0.000000
@homepc ~/programming $ ./result
address of a is 134520864 a=0 address of b is 134520872 b=0.000000
@homepc ~/programming $ ./result
address of a is 134520864 a=0 address of b is 134520872 b=0.000000
@homepc ~/programming $ ./result
address of a is 134520864 a=0 address of b is 134520872 b=0.000000
@homepc ~/programming $ ./result
address of a is 134520864 a=0 address of b is 134520872 b=0.000000
И с разочарованием убеждаемся, что каждый раз одни и те же участки оперативки выделяются. А поскольку её много:
code text
$ free
total used free shared buffers cached
Mem: 2074472 1921844 152628 0 75412 1312424
-/+ buffers/cache: 534008 1540464
Swap: 2939884 0 2939884
то надо придумать что-то другое. Попробуем выделить массив. Новая версия тестовой программы:
code text
#include <stdio.h>
int a[10], i, *j;
int main(void){
i=0;
j=a;
while ( (i<10) && !(*j) ){
printf ("a[%d]=%d\\n",i,*j);
j+=i++;
}
printf("\\n");
printf ("a[%d]=%d\\n",i,*j);
return 0;
}
Результат:
code text
$ gcc calcul2.c -o result2 ; ./result2
a[0]=0
a[1]=0
a[2]=0
a[3]=0
a[4]=0
a[5]=5
Изменим размер массива, скажем, на 20 элементов:
code text
#include <stdio.h>
int a[20], i, *j;
int main(void){
i=0;
j=a;
while ( (i<20) && !(*j) ){
printf ("a[%d]=%d\\n",i,*j);
j+=i++;
}
printf("\n");
printf ("a[%d]=%d\\n",i,*j);
return 0;
}
Результат:
code text
$ gcc calcul2.c -o result2 ; ./result2
a[0]=0
a[1]=0
a[2]=0
a[3]=0
a[4]=0
a[5]=0
a[6]=0
a[7]=134520980
30 элементов:
code text
$ gcc calcul2.c -o result2 ; ./result2
a[0]=0
a[1]=0
a[2]=0
a[3]=0
a[4]=0
a[5]=0
a[6]=0
a[7]=0
a[8]=0
a[9]=0
a[10]=0
a[11]=0
a[12]=0
a[13]=0
a[14]=0
a[15]=0
a[16]=0
a[17]=0
a[18]=0
a[19]=0
a[20]=0
a[21]=0
a[22]=0
a[23]=0
a[24]=0
a[25]=0
a[26]=0
a[27]=0
a[28]=0
a[29]=0
a[30]=0
А тут все 30 элементов оказались в куске памяти, инициализированном нулями.
Ну и на закуску, динамический массив (из C99):
code text
#include <stdio.h>
int i,*j,k;
int main(void){
printf ("enter dimension of array: ");
scanf ("%d", &k);
int a[k];
i=0;
j=a;
while ( (i<k) && !(*j) ){
printf ("a[%d]=%d\n",i,*j);
j+=i++;
}
printf("\n");
printf ("a[%d]=%d\n",i,*j);
return 0;
}
Компилируется так:
gcc -std=c99 calcul3.c -o result3
Результаты:
code text
$ ./result3
enter dimension of array: 16
a[0]=0
a[1]=0
a[2]=-1080289182
$ ./result3
enter dimension of array: 20
a[0]=-1208969208
$ ./result3
enter dimension of array: 30
a[0]=-1208229888
$ ./result3
enter dimension of array: 1000
a[0]=0
a[1]=0
a[2]=0
a[3]=0
a[4]=0
a[5]=0
a[6]=0
a[7]=0
a[8]=0
a[9]=0
a[10]=0
a[11]=0
a[12]=0
a[13]=0
a[14]=0
a[15]=0
a[16]=0
a[17]=0
a[18]=0
a[19]=0
a[20]=0
a[21]=0
a[22]=0
a[23]=0
a[24]=0
a[25]=0
a[26]=0
a[27]=0
a[28]=0
a[29]=-1208724539
$ ./result3
enter dimension of array: 50
a[0]=0
a[1]=0
a[2]=0
a[3]=-1208978780
Результаты говорят сами за себя.
Кстати, можно вынести мой и не только флуд не по теме отдельно куда-нить?