Как я могу узнать, не был ли назначен многомерный массив? - PullRequest
0 голосов
/ 24 ноября 2011

Если у меня есть два массива, это нравится:

short** x;
short** y = functionThatReturnsAnArray();

В этой ситуации sizeof(x) == sizeof(y).Оба равны 4, я считаю, что это потому, что внешний массив является просто массивом указателей и, следовательно, фактически не имеет какой-либо оперативной памяти, выделенной ему.значение?

Спасибо,

Джо

Ответы [ 3 ]

2 голосов
/ 24 ноября 2011

Вы не можете проверить, была ли назначена переменная. Значение неинициализированной переменной не определено IIRC. Согласно Назначение указателя на неинициализированную переменную изменяет ее значение? (найдено Сетом Карнеги), даже доступ к нему вызывает неопределенное поведение.

Решение? Явно назначьте дозорное значение и проверьте его. Для указателей NULL обычно имеет смысл.

2 голосов
/ 24 ноября 2011

Из комментария в исходном сообщении вы имеете в виду, можете ли вы сказать, было ли присвоено значение переменной. Мы называем это инициализация . Если значение не было сохранено в переменной, оно неинициализировано , и это плохо, потому что вы никогда не знаете, что там может быть, и нет, вы не можете проверить, было ли оно инициализировано, поэтому инициализируйте его, когда Вы заявляете об этом.


sizeof(x) == sizeof(y) потому что они объявлены как один и тот же тип (short**); их содержимое не имеет значения (на самом деле sizeof определяется компилятором, поэтому он часто не может знать, что в нем).

Если вы хотите узнать, равны ли области памяти, на которые указывает каждая, нулю, вам нужно будет сделать это вручную (и вам нужно знать, какова длина каждого массива):

int x_empty = 1;

for(int i = 0; i < x_length_d1 && x_empty; i++) {
    if(x[i] == NULL) {
        // Handle a missing row however you want.
    }
    for(int j = 0; j < x_length_d2 && x_empty; j++) {
        if(x[i][j] != 0) x_empty = 0;
    }
}
2 голосов
/ 24 ноября 2011

sizeof возвращает размер short** (указатель на короткий указатель), который в вашей системе составляет 4 байта.Если вы выделяете память, вы должны знать, сколько байтов выделено, и также передавать это значение.

Например:

size_t size_allocated = 0;
short** y = functionThatReturnsAnArray(&size_allocated);

short ** functionThatReturnsAnArray(size_t * size) {
    short ** buff;
    size_t size_to_allocate = 5 * sizeof(short *);
    buff = malloc(size_to_allocate);
    if (!buff) {
        *size = size_to_allocate;
    }
    else {
        *size = 0;
    }
    return buff;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...