- Строковые типы в C, Pahanivo, 17:07 , 24-Июн-14 (1)
- Строковые типы в C, noisebringer, 23:15 , 24-Июн-14 (4) –1
>> Всем доброго времени суток. >> Недавно начал использовать язык программирования С. Интересный язык, должен сказать. > я так понимаю дело дальше абзаца "А давайте напишем программу Hello world > ..." не дошло?я так понимаю ответ дальше фразы "я так понимаю дело дальше абзаца "А давайте напишем программу Hello world... не дошло?" не дошел?
- Строковые типы в C, Evolve32, 19:42 , 24-Июн-14 (2)
- Строковые типы в C, noisebringer, 23:07 , 24-Июн-14 (3) –1
В первую очередь хотелось бы поблагодарить за адекватный ответ. Надеюсь вас сильно не затруднит провести небольшой лик-без :)>> Самый первый вопрос, который рождается в голове, это является ли объявления номер >> 4, 6 идентичными? > Нет > 4 - массив > 6 - указатель Что из этого проистекает, как это отражается непосредственно на работе программы? То есть я ведь могу точно так же сделать strcat в lala и из неё, обращаться посимвольно в обоих вариантах. >> Тот же вопрос для объявление номер 3 и 5. > Нет > 3 - массив из 5 символов, а > 5 - из 4, причем с выходом за границу массива Про пять символов вы имеете в виду нолик в конце? >> В чём разница между объявлениями 5, 2 и 3? > 2 - находится в стеке как константа. > 3 - в куче, размер массива определен автоматически > 5 - в куче, размер определен ручками > Единственный совет - стек лучше не загромождать и не надеятся, что все > libc выделяют для него столько же памяти, сколько glibc Тут всё понятно :)
- Строковые типы в C, pavlinux, 00:39 , 25-Июн-14 (7)
- Строковые типы в C, noisebringer, 03:54 , 25-Июн-14 (9)
>> 5 - из 4, причем с выходом за границу массива > Нет там никакого выхода! Просто нуля в конце не будет. Из этих > соображений > эту строку нельзя напрямую юзать в строковых функциях strcpy, strcmp, printf %s > и т.д.Очень благодарен за дельное замечание!
- Строковые типы в C, Andrey Mitrofanov, 09:41 , 25-Июн-14 (16)
- Строковые типы в C, Andrey Mitrofanov, 09:51 , 25-Июн-14 (17)
- Строковые типы в C, noisebringer, 04:17 , 25-Июн-14 (12) –1
До этого я имел дело с языками в которых память может распределяться автоматически, а тут такого дела не оказалось и меня мучал вопрос, как сделать так, чтобы не разводить бред из серии lala[1000000] = "lala", а всё остальное свободное. Оказалось, что здесь это делается так char *lala; //Объявляем указатель lala = (char *) calloc(strlen("lala") + 1, sizeof(char)); // выделяем в куче кусочек памяти заполненный нулями необходимый для строки lala strcat(lala, "lala"); // записываем туда строку lala char tutu[5] = "tutu"; tutu[5] = 0; lala = (char *) realloc(lala, (strlen(lala) + strlen(tutu) + 1) * sizeof(char)); //добавляем память для строки tutu strcat(lala, tutu); //записываем строку tutu printf("lala is %s\n", lala); free(lala); Надеюсь, что здесь всё написано правильно, за исключением обработки возможных ошибок при распределении памяти, но здесь их можно опустить ибо это пример, и тему можно закрывать :)
- Строковые типы в C, pavlinux, 02:46 , 26-Июн-14 (23)
- Строковые типы в C, noisebringer, 05:43 , 26-Июн-14 (25)
>> Надеюсь, что здесь всё написано правильно, > tutu[5] = 0; /* Array out of bounds. Kernel panic. Topol-M has > been started. USA destroyed */ > И ваще, это "плохая" строка, забудь про такие фишки (на ближайшие лет > 7-8). > Ты либо улетишь за пределы массива, либо затрёшь последний символ.Почему out of bounds если изначально массив объявлялся как массив из пяти элементов? Если не так, то каким образом обозначать окончание строки? '\0' ? И чем отличается '\0' от просто 0?
- Строковые типы в C, Аноним, 06:44 , 26-Июн-14 (26)
- Строковые типы в C, noisebringer, 09:22 , 26-Июн-14 (29)
>>> Надеюсь, что здесь всё написано правильно, >> tutu[5] = 0; /* Array out of bounds. Kernel panic. Topol-M has >> been started. USA destroyed */ >> И ваще, это "плохая" строка, забудь про такие фишки (на ближайшие лет >> 7-8). >> Ты либо улетишь за пределы массива, либо затрёшь последний символ. > Почему out of bounds если изначально массив объявлялся как массив из пяти > элементов? > Если не так, то каким образом обозначать окончание строки? '\0' ? И > чем отличается '\0' от просто 0?Правда-правда. Опять попутал с количественными и порядковыми циферками :)) tutu[4] = 0 а элементы 0,1,2,3 занимают четыре элемента строки. Благодарен за напоминание :) - Строковые типы в C, pavlinux, 01:17 , 27-Июн-14 (32)
- Строковые типы в C, pavlinux, 00:07 , 25-Июн-14 (6)
- Строковые типы в C, noisebringer, 03:55 , 25-Июн-14 (10)
>> Может быть существуют ещё варианты, но мне пока что повстречались только эти. > char *lala[] = {"lala"}; Мусье знает толк в извращениях :)
- Строковые типы в C, Аноним, 10:56 , 25-Июн-14 (18) –1
- Строковые типы в C, noisebringer, 16:51 , 30-Июн-14 (34) –2
Нашел для себя отличие между вариантами 4 и 6. Вариант 4 компилятор не дает использовать внутри функций.
- Строковые типы в C, pavlinux, 17:05 , 30-Июн-14 (35)
- Строковые типы в C, noisebringer, 17:11 , 30-Июн-14 (36)
warning: function returns address of local variableЭто говорит компилятор примерно в таком случае: char *f() { char lala[10]; return lala; } int main() { printf("%s", f()); return 0; }
- Строковые типы в C, pavlinux, 18:53 , 30-Июн-14 (37)
- Строковые типы в C, noisebringer, 20:27 , 30-Июн-14 (38)
Меня только одно беспокоит. Для того чтобы функция могла возвращать указатель, нужно чтобы в ней делался alloc какого-то количества памяти. А если делается alloc, то его нужно free. А если перед окончанием функции сделать его free, то, по идее, это значит что память где хранится результат и куда в дальнейшем будет ссылаться основной код как бы free и в любой момент может быть потерта. Но если не в конце функции, то где делать это free.P.S. Спасибо за лестное замечание. На данный момент глобальные переменные отсутствуют :)
- Строковые типы в C, Аноним, 20:43 , 30-Июн-14 (39)
- Строковые типы в C, noisebringer, 20:51 , 30-Июн-14 (40)
А вот тут не понял. Чтобы функция могла вернуть ссылку на какую-то область памяти, и в этой области памяти что-то лежало, то нужно сначала выделить эту область, потом сложить туда что-то. А потом вернуть ссылку на эту область.Но если делается alloc, то где-то должен делаться free. Где?
- Строковые типы в C, pavlinux, 02:35 , 01-Июл-14 (41)
- Строковые типы в C, noisebringer, 05:46 , 01-Июл-14 (42)
Так я и предполагал, так я и сделал :) Указатели на функции. Видел краем глаза, но пока возиться не охото, но они быстрее говорять.
- Строковые типы в C, noisebringer, 09:38 , 01-Июл-14 (43)
Ой. Перепутал :) Не указатель на функцию :) В общем идею уяснил :)
- Строковые типы в C, pavlinux, 21:04 , 01-Июл-14 (44)
- Строковые типы в C, Andrey Mitrofanov, 10:02 , 02-Июл-14 (45)
- Строковые типы в C, noisebringer, 12:19 , 02-Июл-14 (46)
Насколько я знаю это не через ж**у, а так быстрее работать будет. Указатели на функции вроде как быстрее.
- Строковые типы в C, pavlinux, 14:45 , 02-Июл-14 (47)
- Строковые типы в C, noisebringer, 19:41 , 02-Июл-14 (48)
- Строковые типы в C, anonymous, 00:32 , 03-Июл-14 (50)
- Строковые типы в C, pavlinux, 02:00 , 03-Июл-14 (51)
- Строковые типы в C, Andrey Mitrofanov, 09:24 , 03-Июл-14 (53)
- Строковые типы в C, anonymous2, 20:18 , 03-Июл-14 (54)
- Строковые типы в C, pavlinux, 02:40 , 04-Июл-14 (55)
- Строковые типы в C, anonymous, 00:21 , 03-Июл-14 (49)
- Строковые типы в C, datswd, 18:49 , 04-Ноя-14 (56) –1
- Строковые типы в C, pavlinux, 19:46 , 04-Ноя-14 (57)
- Строковые типы в C, noisebringer, 16:40 , 05-Ноя-14 (58)
>> Для того чтобы в C по-человечески работать > Оптимист :) Спасибо. :) А что вы думаете о самом подходе к работе со строками?
- Строковые типы в C, NoiseBringer, 07:50 , 12-Янв-15 (62) –2
|