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.   Обратится к элементам массива через указатель.


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

(void*)0 != NULL

#include <iostream>
#define NULL ((void*)1)
int main(int, char**)
{
	if ((void*)0 != NULL) 
		std::cout << "!=" << std::endl;
	else
		std::cout << "==" << std::endl;	
}
q.cpp:2:1: warning: "NULL" redefined
In file included from /usr/include/wctype.h:34,
                 from /usr/include/c++/4.3/cwctype:51,
                 from /usr/include/c++/4.3/bits/locale_facets.h:46,
                 from /usr/include/c++/4.3/bits/basic_ios.h:44,
                 from /usr/include/c++/4.3/ios:50,
                 from /usr/include/c++/4.3/ostream:45,
                 from /usr/include/c++/4.3/iostream:45,
                 from q.cpp:1:
/usr/lib/gcc/x86_64-linux-gnu/4.3.4/include/stddef.h:400:1: warning: this is the location of the previous definition

Результат

!=

anonymous
()

http://dualist.stanford.edu/~ee265/labs/doc/OptCCompiler.pdf

The TMS320C55x C/C++ compiler 5.3 Data Types

signed char         16 bits ASCII         -32 768          32 767
char, unsigned char 16 bits ASCII         0                65 535
short, signed short 16 bits 2s complement -32 768          32 767
unsigned short      16 bits Binary        0                65 535
int, signed int     16 bits 2s complement -32 768          32 767
unsigned int        16 bits Binary        0                65 535
long, signed long   32 bits 2s complement -2 147 483 648   2 147 483 647
unsigned long       32 bits Binary        0                4 294 967 295
long long           40 bits 2s complement -549 755 813 888 549 755 813 887
unsigned long long  40 bits Binary        0                1 099 511 627 775

Кто-то ещё продолжает думать, что char всегда 8 бит?

anonymous
()

Ксати тем, кто думает что double это 2 float 64, там рядом информация

float       32 bits IEEE 32-bit 1.175 494e-38 3.40 282 346e+38
double      32 bits IEEE 32-bit 1.175 494e-38 3.40 282 346e+38
long double 32 bits IEEE 32-bit 1.175 494e-38 3.40 282 346e+38
anonymous
()
Ответ на: комментарий от Love5an

>Я не зря лисп-машины упомянул, да?
Какой был вопрос? «Как на С динамически выделить память для двумерного массива char». Каким образом Ваше упоминание каких-то лисп-машин помогает разобраться с выделением памяти для масива char в языке C?

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

Упоминание это уже в контексте флуда, который mannaz развел, пытаясь доказать то ли то, что wchar_t всегда вмещает больше char, то ли то, что в C++ есть строки, толи еще какой-то бред.

не-8-битые байты встречаются так же часто, как и работающие лисп-машны, или, хотя бы, ОС на лиспе, т.е. ими можно пренебречь, хотя и бывают.

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

школьниками, кстати, будешь одноклассников своих называть
стыдливое закрывание мата звездочками вот это вот натурально откуда-то из школы

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

>В C++ std::string это просто класс, маскирующийся под строки.

Ты всёже ответь, что такое по твоему строки? А то както безосновательно звучит.

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

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

Пример компилятора TMS320C55x C/C++ compiler это опровергает.

Love5an: Поскольку о wchar_t стандарты ничего не гарантируют, то да, единственный гарантированный вид строк это ASCII.


standart C99 7.17.2 это опровергает:

wchar_t which is an integer type whose range of values can represent distinct codes for all members of the largest extended character set specified among the supported locales;

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

>TMS320C55x
См. выше про лисп-машины.

standart C99 7.17.2 это опровергает:

Каким местом опровергает? Где тут какие-то гарантии?
Нет, даже так: где сказано, что largest extended character set specified among the supported locales обязательно должен быть шире ASCII-7?

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

>Тип данных такой, подмножеством которого является тип, который имеют строковые литералы.

Ну и чем тебе тут std::string не нравится?

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

>В C++ std::string это просто класс, маскирующийся под строки.

Стандарт глава 21 Strings library ведение пункт 1

This clause describes components for manipulating sequences of “characters,” where characters may be of any POD 1 (3.9) type. In this clause such types are called char-like types, and objects of char-like types are called char-like objects or simply “characters.”

Строки из символов в виде набора char класса string в С++ являются частым случаем этого класса. Они от этого перестают быть строками?? Что же такое строка тогда, если это не последовательность символов?

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

>wchar_t which is an integer type whose range of values can represent distinct codes for all members of the largest extended character set specified among the supported locales;

Эта фраза из стандарта С99 означает, что если есть поддержка локали из символов UTF-32, то этот символ UFT-32 поместится в wchar_t. Стандарт это гарантирует.

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

Конечно, стандарт C++ называет std::string строками. Еще бы ему их так не называть. А еще стандарт C++ говорит что C++ это объектно-ориентированный язык, и даже, вроде бы, мультипарадигмальный. Но от этого C++ таким становится чтоли?

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

> among the supported locales
эта фраза разве не понятна? Стандарт не гарантирует, что char везде будет 8 бит. Стандарт не гарантирует, что везде будет поддержка UTF-32.

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

Стандарт гарантирует, что char это байт(пусть, байт из количества бит, достаточного для представления минимального набора символов). Стандарт не гарантирует, что wchar_t шире char(т.е. подъебка mannaz на предмет того, что, о, круто, кроме «» оказывается, есть еще L"" строки, оснований не имеет).

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

>Не знаю, может быть то, что строковые литералы это const char*, а std::string это std::string?
В С строк нет, есть функции для работы с некими часто встречающимися данными, окончание которых обозначается в них самих с помощью 0.
В C char* это не строка. Это просто указатель на область в памяти. А вот std::string это уже строка с хранением и обработкой.
Но это уже чистая философия.

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

>В C char* это не строка.
Сам по себе char* это не строка, естественно. А вот нуль-терминированный массив char это уже строка.

А вот std::string это уже строка с хранением и обработкой.

Это херня какая-то, а не строка.

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

> Это херня какая-то, а не строка.

аргументация с формулировкой «херня какая-то» - звучит неубедительно

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

wchar_t может не быть шире char. Задача wchar_t - вместить в себя все имеющиеся символы. Если для этого досточно размера char, то значит wchar_t будет равен char.

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

>А вот нуль-терминированный массив char это уже строка

.................

Это херня какая-то, а не строка.



Надеюсь Вам будет нетрудно дать определение понятия «строка»? Что бы все остальные могли выделять среди программных сущностей ту сущность, которую Вы называете «строка»?

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

Ок. Тогда более конкретно, для особенно плюсанутых.

Строка это последовательность символов.
В Си есть последовательности(как статические массивы или просто как куски памяти), есть символы(char), соответственно есть и последовательности символов. Это и есть строки.
В C++ последовательностей нет, кроме как сишных. Символов тоже. Соответственно, строк там, окромя сишных, нет. А что же такое std::string? std::string это класс, который пытается эмулировать семантику строкового типа из полноценных высокоуровневых языков, навроде жабы или, скажем, коммонлиспа. Объекты этого класса это не последовательности, это объекты этого класса. Вот вобщемто и всё.

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

>аргументация с формулировкой «херня какая-то» - звучит неубедительно

Саттер приводит std::string как пример того как не надо проектировать классы.

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

> std::string это класс, который пытается эмулировать семантику строкового типа из полноценных высокоуровневых языков, навроде жабы или, скажем, коммонлиспа. Объекты этого класса это не последовательности, это объекты этого класса.

а в жабе значит это не объекты?

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

По твоему описанию std::string и есть строки. Других строк ты не привёл.

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

>Ок. Тогда более конкретно, для особенно плюсанутых.

Строка это последовательность символов.

В Си есть последовательности(как статические массивы или просто как куски памяти), есть символы(char), соответственно есть и последовательности символов. Это и есть строки. В C++ последовательностей нет, кроме как сишных. Символов тоже. Соответственно, строк там, окромя сишных, нет. А что же такое std::string? std::string это класс, который пытается эмулировать семантику строкового типа из полноценных высокоуровневых языков, навроде жабы или, скажем, коммонлиспа. Объекты этого класса это не последовательности, это объекты этого класса. Вот вобщемто и всё.

В таком определении «строки» этих самых строк в С++ действительно нет, там есть только строки из С. Но в этом и был смысл. Б. Строуструп постоянно твердил про эффективность. Встраивать в язык какую-то ОДНУ реализацию строк глупо. Для разных применений могут требоваться разные реализации строк для эффективного решения конкретной задачи. Поэтому обработка строк вынесена в библиотеки. Перегрузки операторов и т.п. этому помогают.

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

Отличайте встроенные в язык вещи от стандартных библиотек, не являющихся частью языка. В С++ строки в библиотеке находятся, а не в языке. В языке С++ их вообще нет (их даже в С вобщем-то нет). В Жабе вроде бы встроены в язык, не знаком с Жабой.

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

>std::string это класс, который пытается эмулировать семантику строкового типа из полноценных высокоуровневых языков, навроде жабы или, скажем, коммонлиспа.

Расскажи нам чес std::string отличается от этого - http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html

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

>Б. Строуструп постоянно твердил про эффективность.

И как результат мы имеем зоопарк неэффективных стрингов написанных плюсавыми фанбоями по устаревшим книжкам, но от которых невозможно избавиться чтобы не сломать имеющийся код. Характерное для Б.С отсутствие дальновидности.

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

> В жабе вообще все объекты, но строки в жабе это последовательности символов, в отличии от C++

и std::string и String - это обертки над буфером символов

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

Но вообще, конечно, в C# строки полноценнее будут, чем в жабке, они там и интерфейсы последовательностей наследуют, и внешне почти точно как вектора выглядят.

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

да все вообще сахар над указателями и опкодами, пиши на C++, если нравится(кому то вон и копрофагия нравится, я не против)

В Жабе это полноценный тип данных. В C++ном STL - херня какая-то, вот именно что кривая обертка на char.

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

> В Жабе это полноценный тип данных. В C++ном STL - херня какая-то

мы пошли на второй круг, а принципиальной разницы( кроме конечно «херня какая-то» ) между жабовскими и плюсовыми строками вы нам так и не озвучили ;)

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

Зачем строки встраивать в язык? Зоопарк строк из библиотек лучше, чем игнорировать встроенные строки, пользуясь для своей задачи специальной строковой библиотекой. Для общих потребностей std::string отлично подходит, лично я не жалуюсь.

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

>В Жабе это полноценный тип данных.

И какова эффективность этого типа данных? Можно ли заменить реализацию строк в жабе своей реализацией для конкретной программы? В с++ это делается - как вариант - заменой #include <string> на #include <my_string>, потому что оно не встроено язык.

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

D жабе «A String represents a string in the UTF-16 format». А если надо что-то другое, а не UTF-16? А если надо реализацию алгоримов на строках более эффективную для данной задачи, чем есть встроенная в жабу?

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

> А если надо реализацию алгоримов на строках более эффективную для данной задачи, чем есть встроенная в жабу?

пишется своя реализация с возможностью конвертировать в/из String

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

>между жабовскими и плюсовыми строками вы нам так и не озвучили ;)

Писал я уже тысячу раз - и про substring() за O(1) и про intern-пул, и про тредовую безопасность и т.п.

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

> Писал я уже тысячу раз - и про substring() за O(1) и про intern-пул, и про тредовую безопасность и т.п.

мы вообще-то разговаривали за то, что есть строка, а что нет ( это так к сведению )

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