двойное распределение памяти - PullRequest
1 голос
/ 15 июля 2010

char ** r;r = (char **) malloc (10);

вышеприведенного распределения достаточно? Разве мне не нужно выделять для цикла char * r for? Любой может объяснить, какой из них правильный?

Ответы [ 4 ]

5 голосов
/ 15 июля 2010

Это, безусловно, неправильно. char* имеет размер, который не делит 10 на большинство архитектур.

Вот пример кода:

char** r;
// Allocate an array of 10 char* in r
r = (char**)malloc(10 * sizeof(*r));

Теперь каждый элемент r является выделенным char* и может использоваться для указания где-то.

Обратите также внимание, что в приведенном выше коде я приводил (как и вы) результат malloc. Это необходимо, только если этот код скомпилирован с помощью компилятора C ++, а не компилятора C, который не нуждается в приведении. OTOH, в C ++ вам понадобится new, а не malloc.

4 голосов
/ 15 июля 2010

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

Вероятно, указатель на символ будет больше одного байта.Надеюсь, ваш компилятор знает о его реальном размере.

char** r = (char**)malloc(sizeof (char*) * 10);

Это выделяет достаточно места для 10 указателей на символы.Однако в настоящее время они никуда не годятся.Вы также должны выделить для них память:

int sizeOfMyStrings = 20;
for (int i = 0; i < 10; i++)
    r[i] = (char*)malloc(sizeoOfMyStrings);

Это дает вам 10 указателей на символы, каждый из которых указывает на 20 байтов выделенной памяти.это будет sizeof(char), а sizeof(char) определено как 1.)

0 голосов
/ 16 июля 2010

Простой способ выделить память для "2-мерной" структуры так, как вам нужно:

#include <stdlib.h> /* for malloc() */

char **r;
/* we will allocate 'size' values, each of 'data_size' length */
size_t size = 10;
size_t data_size = 42;
size_t i;

/* allocate 'size' objects of the right type.
 *
 * Notes:
 *
 * 1. no casting the return value of malloc(),
 * 2. r = malloc(size * sizeof *r) is type-agnostic, so
      if you change the type of r, you don't need to remember
      to change the malloc() call */

r = malloc(size * sizeof *r);

/* Error check omitted for clarity.  In real code, always check for return
   value of malloc() */

for (i=0; i < size; ++i) {
    /* once again, no cast, and we use x = malloc(size * sizeof *x) idiom */
    r[i] = malloc(data_size * sizeof *r[i]);
}

Преимущество вышеупомянутой схемы заключается в том, что она работает с минимальными усилиями для 3-, 4- или более крупных размеров и также легче читается.

В приведенном выше коде в цикле я мог бы написать malloc(data_size) вместо malloc(data_size * sizeof *r[i]), потому что sizeof(char) гарантированно будет равно 1, но опять же, я предпочитаю приведенную выше форму, потому что она не зависит от типа.

0 голосов
/ 15 июля 2010

Char ** r - указатель на символьный указатель. Это можно рассматривать как массив строк. Если вы хотите инициализировать всю память для массива, вам нужно сделать

r = (char **)malloc(sizeof(char *) * NUMBER_OF_ELEMENTS_OF_ARRAY);
for (i = 0; i < NUMBER_OF_ELEMENTS_OF_ARRAY; i++) {
    r[i] = (char *)malloc(sizeof(char) * LENGTH_YOU_WANT_STRING);
}

или что-то в этом роде.

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