2015-11-10 3 views
5

Я пытался отладить мой код в другой функции, когда я наткнулся на это «странное» поведение.Матрица не заполнена нулевым объявлением

#include <stdio.h> 

#define MAX 20 

int main(void) { 
    int matrix[MAX][MAX] = {{0}}; 

    return 0; 
} 

Если я поставил точку останова на return 0; линии, и я смотрю на локальные переменные с Code :: Blocks матрица не полностью заполнена нулями. Первая строка есть, но остальная часть массива содержит только случайный мусор.

Я знаю, что может сделать двойной for цикл инициализации вручную всего до нуля, но не был стандартным C должен заполнить эту матрицу к нулю с {{0}} инициализатором?

Возможно, потому что это был долгий день, и я устал, но я мог бы поклясться, что знаю это.

Я пытался компилировать с различными стандартами (с Code :: Blocks в комплекте gcc компилятор): -std=c89, -std=c99, std=c11 но это то же самое.

Любые идеи о том, что не так? Не могли бы вы объяснить мне это?

EDIT: Я спрашиваю о инициализаторе {{0}}.

Я всегда думал, что он заполнит все столбцы и все строки до нуля.

EDIT 2: Меня беспокоит именно Code::Blocks и его комплект GCC. Другие комментарии говорят, что код работает на разных платформах. Но почему это не работает для меня? :/

Спасибо.

+1

хорошо этот ответ говорит, что вы делаете это правильно http://stackoverflow.com/a/1688758/1339987 – djechlin

+0

Использование 2- что на самом деле это часто вызывает больше проблем, чем это стоит. Почему бы просто не использовать одномерный массив, где первые MAX-элементы считаются первой строкой, следующие MAX-элементы вторая строка и т. д. разыменование по матрице [строка * NCOLS + col]; в этом случае вы можете более портативно инициализировать его как просто матрицу [NCOLS * NROWS] = {0}; – Dmitri

+0

@Dmitri, потому что вы должны принять первый MAX-элементы - это первая строка, математика, почтение с большей математикой - я полагаю, вы ответили на ваш вопрос: P – djechlin

ответ

3

Я понял это.

Даже без флага оптимизации на компилятор, отладчик информации была просто неправильно ..

Так я распечатал значение с двумя for петлями, и это было правильно инициализировано, даже если отладчик говорит иначе (странно) ,

Спасибо, однако, за комментарии

-1

Ваш код должен инициализировать его до нуля. На самом деле, вы можете просто сделать int matrix[MAX][MAX] = {};, и он будет инициализирован в 0. Однако int matrix[MAX][MAX] = {{1}}; будет только установить матрицу [0] [0] до 1, а все остальное 0.

Я подозреваю, что вы наблюдаете с Code :: Blocks - это то, что отладчик (gdb?) Не совсем показывает вам, где именно он разбивается на код - либо тот, либо какой-либо другой побочный эффект от оптимизатора. Чтобы проверить эту теорию, добавьте следующий цикл сразу после инициализации:

`` `int i, j;

for (i = 0; i < MAX; i++) 
    for (j = 0; j < MAX; j++) 
    printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]); 

`` `

и посмотреть, если то, что он печатает согласуется с выводом отладчика.

Я собираюсь угадать, что может произойти то, что, поскольку вы не используете матрицу, оптимизатор, возможно, решил не инициализировать ее. Чтобы проверить, разобрать свой основной (disass main в gdb и посмотреть, действительно ли инициализируется матрица.

+1

'int matrix [MAX] [MAX] = {};' не разрешено в стандарте C –

+0

Я уже нашел ответ. Вы не можете просто поставить '{}' без нуля в нем, а двойные скобки лучше '{{0}}'. Изначально инициализировался массив, я понял, что либо отладчик просто показывал ячейки неправильно, либо компилятор делал некоторую оптимизацию под капотом (без установки каких-либо флагов оптимизации) – Zorgatone

+0

Также я использовал матрицу позже в коде , Я просто не показываю остальную часть программы, потому что это нерелевантно, поскольку я приостанавливаю отладчик сразу после объявления и инициализации – Zorgatone

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

  • Нет связанных вопросов^_^