Я новичок в программировании на C и я нашел что-то я не понимаю:Странные значения при инициализации массива
При инициализации массива без заданных значений, я думал, что все элементы будут равны нулю. Я написал эти несколько строк кода ...
int main()
{
int obj[10][4];
for (int a = 0; a < 10; a++)
{
print("%d\t%d\t%d\t%d\n", obj[a][0], obj[a][1], obj[a][2], obj[a][3]);
}
}
... и был очень смущен своей продукции:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 7661
7960 2697 2260 7960
1551630361 -2130960380 146780176 -2130960380
Я не понимаю, почему некоторые значения равны нулю, а некоторые из них не. Я был еще более смущен, что эти цифры меняются, когда я добавляю больше кода. Например, я изменил предыдущий пример и добавили еще один print()
...
int main()
{
int obj[10][4];
print("start\tstop\tcenter\tdist\n\n");
for (int a = 0; a < 10; a++)
{
print("%d\t%d\t%d\t%d\n", obj[a][0], obj[a][1], obj[a][2], obj[a][3]);
}
}
... получаю это:
start stop center dist
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 7673
7972 2709 2272 7972
1551630361 -2130960380 146780176 -2130960380
Используя больший массив, эти цифры находятся не только в его конце. Первые несколько значений всегда равны нулю, но затем происходит «что-то».
Я нашел решение here at SO, используя memset()
, что работает для меня, но ... что здесь происходит?
Может кто-нибудь объяснить это, используя слова, которые C-новичок поймет?
Ну, вы не инициализировали, поэтому получаете неинициализированные значения. В основном нули, но никогда не гарантируется. – stefan
Совет для дальнейшего развития: если вы получаете _unexpected_ поведение с действительно странными значениями, попробуйте выполнить команду 'valgrind'. Это может дать вам подсказки, где ошибка (неинициализированные переменные довольно хорошо обнаруживаются valgrind). – stefan
@stefan: Спасибо за эту информацию, но сейчас это слишком много. Я посмотрел «valgrind» и добавил закладки в некоторые сайты, которые я мог бы понять, после использования C немного дольше ;-) – xph