Сетка с использованием указателей и Malloc - PullRequest
0 голосов
/ 21 марта 2011

Я пытаюсь проработать некоторые примеры классов и застрял в следующем:

Сетка массива должна имеют ширину длины с каждой записью, представляющей столбец клетки. Столбцы, имеющие несколько занятых ячеек, должны быть массив символов malloc длины высота.

с заданным заголовком:

void grid(char **grid, int width, int height)

сетка определяется в другом файле как:

char **grid;

Как я уже говорил, я застрял при использовании malloc, в настоящее время у меня есть:

int x;
*grid = malloc(width * sizeof(char));

        for(x = 0; x < width; x++){
            grid[x] = malloc(height * sizeof(char));
        }

Может ли кто-нибудь взглянуть на меня, чтобы дать мне несколько советов о том, как правильно выполнить "Столбцы, в которых есть несколько занятых клеток, должны быть malloc'ed массив символов длины высоты. ", как я не понимаю, как строка:

сетка [x] = malloc (высота * SizeOf (Char));

эквивалентно массиву символов

Спасибо

Ответы [ 4 ]

4 голосов
/ 21 марта 2011

char** grid; - указатель на указатель.

grid = malloc( width* sizeof( char* ) ) ;  // Statement 1

for( int i=0; i<height; ++i )
{
    grid[i] = malloc( height ) ; // Statement 2
}

Понять char** -> char* -> char. Поэтому сначала нужно зарезервировать для хранения адреса на сумму ширина . К Заявлению 1 это достигается. Теперь каждый из этих индексов должен указывать на область памяти, содержащую высоту символов и достигается с помощью Statement 2 .


Диаграмматическое представление звучит более понятно, чем описание. Надеюсь, это поможет ! Diagram

4 голосов
/ 21 марта 2011

В C массив - это указатель на первый элемент массива.Таким образом, массив - это просто блок памяти, а переменная массива указывает на первый элемент в этом блоке памяти.

malloc () резервирует новый блок памяти указанного размера.Чтобы узнать размер типа (т. Е. Количество байтов, необходимое для хранения одной переменной этого типа), используется оператор sizeof.Следовательно, символу необходимо sizeof(char) байт, и, следовательно, высота символам необходимо height * sizeof(char).

Так что с помощью вызова malloc () вы выделяете блок памяти для хранения всех элементов массива, а malloc () возвращает указатель на первый из них.

С помощью определения C для переменной массива (указатель на первый элемент) вы можете присвоить результаты malloc(...) переменной массива.

1 голос
/ 21 марта 2011

Используйте это:

grid = malloc(width * sizeof(char *));

Вы хотите выделить место для width указателей на char - И тогда вы правильно назначите отдельные указатели для height символов в цикле.

Использование typedef делает это более заметным:

typedef char * charpointer;
charpointer * grid = malloc(width * sizeof(charpointer));
0 голосов
/ 21 марта 2011
  1. Сначала вы выделяете пространство для массива указателей [width].Таким образом, вместо *grid = malloc(width * sizeof(char));, который выделяет пространство для символов [width], вы должны использовать *grid = malloc(width * sizeof(* char)); (разница в том, что char равен одному байту, а указатель char равен int (обычно 32-разрядный, но зависит от архитектуры)
  2. В вашем цикле каждый раз, когда вы выделяете (массив) [hight] символов и сохраняете указатель на него в одном из указателей, которые вы указали в (1). Таким образом, grid [x] фактически указывает на выделенный буферchars (это ваш массив)

надеюсь, я ясно дал понять.

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