Как получить длину динамически размещаемых двумерных массивов в C - PullRequest
5 голосов
/ 12 сентября 2010

Вопрос в том, как получить длину динамически размещаемых 2D массивов в C? Я думал, что код ниже должен получить количество строк, но это не так.

char** lines;
/* memory allocation and data manipulation */

int length; //the number of rows

length = sizeof(lines)/sizeof(char*);

Есть мысли по этому поводу?

Ответы [ 6 ]

6 голосов
/ 12 сентября 2010

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

В вашемТестовый пример выше sizeof возвращает размер типа lines, и, следовательно, ваше вычисление длины эквивалентно sizeof(char**)/sizeof(char*) и может иметь тривиальный результат 1, всегда.

2 голосов
/ 12 сентября 2010

Базовая реализация malloc или new должна неизбежно отслеживать размер памяти, выделенной для вашей переменной. К сожалению, нет стандартного способа получить размер выделенного блока. Причина в том, что не все блоки памяти распределяются динамически, поэтому использование функции, которая работает только для динамического распределения, не очень полезно.

void fillwithzero(int* array) {
    unsigned int size = getsize(array); // return 0 for statically allocated array ??
    for(int i = 0; i < size; i++) {
        array[i] = 0;
    }
}

Допустим, у нас есть getsize функция, которая способна волшебным образом получить размер динамически распределяемого массива. Однако, если вы отправите указатель статического массива или некоторого массива, выделенного другими средствами (например, внешней функцией), на fillwithzero, эта функция не будет работать. Вот почему большинство функций C, которые принимают массив, требуют, чтобы вызывающая сторона отправляла размер или максимальный размер массива вместе с самим массивом.

2 голосов
/ 12 сентября 2010

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

struct Line {
    char** text;
    uint32_t size;
};
1 голос
/ 12 сентября 2010

Вы не можете получить длину динамически размещенного массива в C.

Когда вы выделяете ее, вам нужно где-то хранить эту длину, чтобы вы знали, какова ее длина.

Например:

int length = ...;
lines = malloc(length*sizeof(char*));

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

0 голосов
/ 12 сентября 2010

Вы можете получить длину динамически выделяемой памяти, ЕСЛИ вы используете расширение НЕПОРТАЖНОЕ MSVC / MinGW:

#include <malloc.h>
char *m = malloc(1234);
#ifdef __int64
printf("m size = %lu bytes", _msize(m) );
#endif
0 голосов
/ 12 сентября 2010

Вы передаете это вместе со своей ценностью.Там нет никакого способа узнать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...