LINUX.ORG.RU

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


0

0

Вот небольшой код, который выделяет статически память под 2-х мерный массив char.

int n;
char v[][10]={«green»,«red»,«blue»};
for(n=0;n<3;n++)
printf(«%s\n»,v[n]);

Печатает
green
red
blue

Как сделать тоже самое, но память выделять под массив функцией malloc?
Нужно следующее
1.   Определить указатель на двумерный массив char, без выделения памяти на сам массив
2.   Выделить память под 2-х мерный массив функцией malloc
3.   Обратится к элементам массива через указатель.


Здесь никто за тебя дз делать не будет, ну я точно не буду

dimon555 ★★★★★
()
Ответ на: комментарий от Booster

Большое спасибо, работает.

странно только, что такой конструкции

char (*v)[][10];

Я не нашел не в одном учебнике по языку С.

Mixaluch384
() автор топика
Ответ на: комментарий от golodranez

в первой строке указатель на чар в конце - calloc(rows, sizeof(char*))

golodranez ★★★★
()
Ответ на: комментарий от Booster

>v = (char (*)[][10])malloc(100);

ты выделяешь динамический массив и 100 char[10], которые остаются статическими, или я не прав? А топикстартер хочет все динамически.

Я обычно делаю так-же как написал golodranez.

mono ★★★★★
()

День дурацких вопросов в Development на ЛОРе

yoghurt ★★★★★
()
Ответ на: комментарий от mono

>ты выделяешь динамический массив и 100 char[10], которые остаются статическими, или я не прав?
Конечно, не прав.

Booster ★★
()
Ответ на: комментарий от mono

Выделяется указатель v
char (*v)[][10];

выделяется память под сам массив, и укзатель на этот участок записывается в переменную v
v = (char (*)[][10])malloc(100);

проверил, работает так как и требуется.

Вопрос только один, почему такой конструкции нет в учебниках по С

Mixaluch384
() автор топика
Ответ на: комментарий от Mixaluch384

>Вопрос только один, почему такой конструкции нет в учебниках по С

Обычно читаемость кода стоит на первом месте - это ответ на твой вопрос.

golodranez ★★★★
()
Ответ на: комментарий от Mixaluch384

блин, век живи - век учись. не знал о такой конструкции.

mono ★★★★★
()

Переходи на Lithp, у нас есть печеньки и массивы, и строки

(defun foo (m n &rest initial-contents)
  (let ((a (make-array `(,m ,n) :element-type 'character
                       :initial-element #.(code-char 0))))
    (loop with map = (make-array (array-total-size a)
                                 :element-type 'character
                                 :displaced-to a)
          repeat m
          for string in initial-contents          
          for start = 0 then end
          for end = (+ start n)
          do (replace map string :start1 start :end1 end)
          finally (return a))))
Love5an
()
Ответ на: комментарий от Mixaluch384

Советую почитать учебник Подбельского. И да, malloc вам в помощь.

Insomnium ★★★★
()
Ответ на: комментарий от golodranez

В C++ std::string это просто класс, маскирующийся под строки. Строки в C++ есть, но только те, которые доставшиеся в наследство от Си, т.е. null-terminated ascii.

Love5an
()
Ответ на: комментарий от Reset

Точно :-)

Ну, значит вделить массив указателей, а потом ещё для каждого указателя. или написать обёртку для доступа типа c(int x, int y)

ip1981 ☆☆
()
Ответ на: комментарий от Love5an

> char это всегда 8 бит, т.е. вмещающий в себя ascii

Это не так. В следующий раз, перед тем как рассуждать о C++ и стандартах, потрудись хотя бы бегло с ними ознакомиться. Твои вбросы про char, void* и т.п., употребляемые рядом со словами «стандарт» и «гарантирует» только запутывают людей.

mannaz
()
Ответ на: комментарий от Love5an

ISO/IEC 14882


5.3.3 Sizeof
...
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1
...
See 1.7 for the definition of byte
...


1.7 The C++ memory model
The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the BASIC EXECUTION CHARACTER SET and is composed of a contiguous sequence of bits, the number of which is implementation-defined.
...


2.2 Character sets
...
The values of the members of the execution character sets are implementation-defined, and any additional members are locale-specific

mannaz
()
Ответ на: комментарий от mannaz

Прочитай и расскажи мне еще раз о строго 8-битном char'e и ASCII.

mannaz
()
Ответ на: комментарий от mannaz

>The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the BASIC EXECUTION CHARACTER SET and is composed of a contiguous sequence of bits, the number of which is implementation-defined.

Ну вот и отлично, т.е. я имею ввиду, когда у тебя будет лисп-машина, или что-нибудь другое, где байт не равен 8 битам, тогда и будешь предъявлять, ок?

Love5an
()
Ответ на: комментарий от Love5an

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

mannaz
()
Ответ на: комментарий от Love5an

> Не-8-битный байт это неадекватно реальности.

Замечетельно, так и пиши: «реальность гарантирует...», а слово «стандарт» забудь. Не у всех же здесь гуманитарный склад ума.

mannaz
()
Ответ на: комментарий от mannaz

>Не у всех же здесь гуманитарный склад ума.
Да, таких как ты, которым надо каждую логическую цепочку визуализировать здесь, я надеюсь, мало.

(стандарт: char == byte) и (реальность: byte == 8 bit) => (char == 8 bit)
(char == 8 bit) и (ASCII == 0..127) => (ASCII входит в диапазон значений char)

Love5an
()
Ответ на: комментарий от mannaz

http://home.att.net/~jackklein/c/inttypes.html#introduction

Each of the character types occupies exactly one byte. That is, sizeof(char) == 1, by definition in C and C++, and always will.


The value of CHAR_BIT is required to be at least 8. Almost all modern computers today use 8 bit bytes (technically called octets, but there are still some in production and use with other sizes, such as 9 bits. Also some processors (especially D igital Signal Processors) cannot efficiently access memory in smaller pieces than the processor's word size. There is at least one DSP I have worked with where CHAR_BIT is 32. The char types, short, int and long are all 32 bits.

The one byte which is sizof(char) meets the C and C++ definition of a byte, which is the amount of memory required to store a character. It does not necessarily correspond to a machine byte.




char всегда равен 1 байту. А вот 1 байт не обязательно имеет 8 бит. Может иметь больше. Также некоторые процессоры не могут эффективно работать с единицами данных в 8 бит. Им нужно машинное слово.

anonymous
()
Ответ на: комментарий от Love5an

>(реальность: byte == 8 bit

Это «реальность» у процессоров персоналок. У процессора минимальной единицей обработки может быть данные в 32 бита. Байт и char у него будут 32 бита длиной.

anonymous
()
Ответ на: комментарий от Love5an

>The header <limits.h> contains a macro, CHAR_BIT, that expands to an integer constant specifying the number of bits in the character types.

anonymous
()
Ответ на: комментарий от Love5an

Дружок, я отлично понимаю те нехитрые мысли, которые ты пытаешься до меня донести, прибереги свои диаграммы для шпаргалок. В целом, довольно показательна твоя уверенность в том, что (void*)0 != NULL - это вполне реальная ситуация, в то время как не 8-битный char - это лютый п**дец. Не трать мое время, школьник.

mannaz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.