|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Доброе утро. Продолжаю разбираться с Си. Требуется сделать двухмерный текстовый массив. В принципе он создается нормально. Но когда добавил free(massive_var[0][0]); Программа скомпилировалась нормально, но при исполнении упала: ***munmap_chunk(): invalid pointer: 0x00000000004007f9 *** ======= Backtrace: ========= ... ======= Memory map: ======== 0158c000-015af000 rw-p 00000000 00:00 0 [heap] 7fddb5fa5000-7fddb5fba000 r-xp 00000000 fd:00 585126 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7fddb5fba000-7fddb61b9000 ---p 00015000 fd:00 585126 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 ... Aborted Вот сам код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Подскажите пожалуйста как правильно освободить память у ячейки двухмерного массива? Ну и у всего массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 10:30 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Тебе точно С надо? Может С++ задействовать? Это совсем не то что ты думаешь Код: plaintext 1.
если честно я сам не готов объяснить почему это скомпилировалось, наверно потому что это Си ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 10:49 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ, Гуглить. Курсы по Си. Массивы ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 10:53 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Siemargl Уткъ, Гуглить. Курсы по Си. Массивы тут нашел пример, последнее сообщение https://www.cyberforum.ru/c-beginners/thread2496725.html массив объявляется так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
но непонятно это верно или нет. Может есть какой-нибудь пример как надо делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 11:19 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Тебе точно С надо? Может С++ задействовать? Это совсем не то что ты думаешь Код: plaintext 1.
если честно я сам не готов объяснить почему это скомпилировалось, наверно потому что это Си другие элементы всталял - работает. но раз это не то что надо, как-то по-другому придется. :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 11:20 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Siemargl Уткъ, Гуглить. Курсы по Си. Массивы тут нашел пример, последнее сообщение https://www.cyberforum.ru/c-beginners/thread2496725.html массив объявляется так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
но непонятно это верно или нет. Может есть какой-нибудь пример как надо делать? В общем, в этом примере двумерный массив, но одна мерность занимает строка, т.е. по сути это это одномерный массив из строк. Ищу дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 11:42 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Тебе точно С надо? Может С++ задействовать? Это совсем не то что ты думаешь Код: plaintext 1.
если честно я сам не готов объяснить почему это скомпилировалось, наверно потому что это Си Работало т.к. по первому символу как-то вся строка вытаскивалась наверное. Смотрите, это получился двухмерный массив из сиволов (не строк). Т.е. чтобы это был массив из строк надо вместо char* указать строку, наверное свой тип создать надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 11:54 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
сделал 3-х мерный символьный массив. Это получается 2-х мерный строковый. так работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Вывод: Код: plaintext 1. 2.
Но тут хочется strcpy поменять на calloc + присваивание (=) и в объявлении массива использовать не char а char* пока это не получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 12:41 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Siemargl Уткъ, Гуглить. Курсы по Си. Массивы тут нашел пример, последнее сообщение https://www.cyberforum.ru/c-beginners/thread2496725.html массив объявляется так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
но непонятно это верно или нет. Может есть какой-нибудь пример как надо делать? Все тут верно. Только учти что это не двухмерный массив, а массив массивов, точнее массив строк, т.к. строка это массив символов. Хотя ты тоже массив массивов хочешь, двумерный массив так объявляется: Код: plaintext 1.
PS Тебе точно Си надо? Если да, то сначала теорию почитай, книжку какую-нибудь, т.к. это азы, без их знания ничего путного не напишешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 13:04 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Уткъ пропущено... тут нашел пример, последнее сообщение https://www.cyberforum.ru/c-beginners/thread2496725.html массив объявляется так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
но непонятно это верно или нет. Может есть какой-нибудь пример как надо делать? Все тут верно. Только учти что это не двухмерный массив, а массив массивов, точнее массив строк, т.к. строка это массив символов. Хотя ты тоже массив массивов хочешь, двумерный массив так объявляется: Код: plaintext 1.
PS Тебе точно Си надо? Если да, то сначала теорию почитай, книжку какую-нибудь, т.к. это азы, без их знания ничего путного не напишешь. Ритчи бегло прочел. Так не дает объявить: Код: plaintext 1.
str5.c: In function ‘main’: str5.c:11:16: error: expected ‘]’ before ‘,’ token char massive[1,3]; А вот этот вариант нормальный? 22426237 Мне там только надо сделать чтобы массив можно было вне функции main тоже использовать, для этого, как я понял надо не char а char* ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 13:28 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ str5.c: In function ‘main’: str5.c:11:16: error: expected ‘]’ before ‘,’ token char massive[1,3]; Похоже тут уже я напутал, это из C#, нет в С/С++ двумерных массивов. Есть только массивы массивов. Уткъ Ритчи бегло прочел. Очень бегло похоже. Иначе не было бы этого вопроса: Уткъ Мне там только надо сделать чтобы массив можно было вне функции main тоже использовать, для этого, как я понял надо не char а char* Читай про указатели. Очень внимательно читай, т.к. кроме С/С++ их нигде нет, а на них строится вся работа с памятью. Указатель (char*) это массив, указатель на массив указателей (char**) это массив массивов (двумерный) и т.д. Читай книжку чтобы нам сюда ее не перепечатывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 13:42 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Требуется сделать двухмерный текстовый массив. Здесь немножко есть терминологическая путаница и срыв шаблона. В С строки всегда повышают -мерность коллекции. Тоесть 1-мерный массив строк - это 2-мерный (зубчатый) массив chars. И так далее. Вообще если варьировать количество звездочек перед указателем то ты можешь варьировать мерность коллекции. Например Код: plaintext 1.
или Код: plaintext 1.
в функции main например второй аргумент как раз прилетает в виде такого массива. и так далее Код: plaintext 1.
аллокацию такого массива делают по-слоям. Тоесть сначала слой внешний. Потов второй. И потом строчки. Альтренатива зубчатости - это прямоугольная матрица. Но это подходит для строк фиксированного размера. Например номера телефонов. Если средняя длина телефона 7 цифр (в локальной городской сети) то для хранения 1000 телефонов тебе достаточно будет выделять 1000 * (7 + 1) символов. Или многомерная матрица с теми-же явными лимитами. Куб. Например Куб телефонных номеров по всем городам. Допустим гордов 15. Тогда надо аллоцировать 15 * 1000 * (7 + 1) символов. Для таких кубов и гипер-кубов нам нужен только один указатель. Код: plaintext 1.
Куб экономит память только для лимитированных строчек. Навигацию по кубу можно просто делать по формуле остчитывая расстояние от левого верхнего угла в символах. Для языков С/C++ существует аналогия между указателем и именем массива. Недавно на эту тему был очень жаркий спор. Не хотелось-бы углубляться. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 13:58 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
mayton Уткъ Требуется сделать двухмерный текстовый массив. Здесь немножко есть терминологическая путаница и срыв шаблона. В С строки всегда повышают -мерность коллекции. Тоесть 1-мерный массив строк - это 2-мерный (зубчатый) массив chars. И так далее. Вообще если варьировать количество звездочек перед указателем то ты можешь варьировать мерность коллекции. Например Код: plaintext 1.
или Код: plaintext 1.
в функции main например второй аргумент как раз прилетает в виде такого массива. и так далее Код: plaintext 1.
аллокацию такого массива делают по-слоям. Тоесть сначала слой внешний. Потов второй. И потом строчки. Альтренатива зубчатости - это прямоугольная матрица. Но это подходит для строк фиксированного размера. Например номера телефонов. Если средняя длина телефона 7 цифр (в локальной городской сети) то для хранения 1000 телефонов тебе достаточно будет выделять 1000 * (7 + 1) символов. Или многомерная матрица с теми-же явными лимитами. Куб. Например Куб телефонных номеров по всем городам. Допустим гордов 15. Тогда надо аллоцировать 15 * 1000 * (7 + 1) символов. Для таких кубов и гипер-кубов нам нужен только один указатель. Код: plaintext 1.
Куб экономит память только для лимитированных строчек. Навигацию по кубу можно просто делать по формуле остчитывая расстояние от левого верхнего угла в символах. Для языков С/C++ существует аналогия между указателем и именем массива. Недавно на эту тему был очень жаркий спор. Не хотелось-бы углубляться. Большое спасибо! Впитываю информацию. Строки разной длинны, поэтому куб не подойдет, вариант с *** должно быть самое то, по описанию. Пробую повысить мерность вот этого массива, с которым экспериментирую: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 14:16 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 14:18 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Это лишнее Код: plaintext 1. 2.
В примере было два выделения массива. Это одномерный, у тебя не используется. в остальном нормальный код 22426300 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 14:25 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-( Ты-же копируешь на линуксы и там собираешь? Тогда гоняй valgrind каждый раз при каждом запуске. Это будет лакмусовая бумажка. Как только что-то не то с утечкой или доступом по неаллоцированому - ты получишь желтую карточку. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 14:30 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
mayton Уткъ Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-( Ты-же копируешь на линуксы и там собираешь? Тогда гоняй valgrind каждый раз при каждом запуске. Это будет лакмусовая бумажка. Как только что-то не то с утечкой или доступом по неаллоцированому - ты получишь желтую карточку. Да, так и есть, копирую и там собираю. valgrind , почитаю, спасибо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 14:37 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Это лишнее Код: plaintext 1. 2.
В примере было два выделения массива. Это одномерный, у тебя не используется. в остальном нормальный код 22426300 Это убрать, понятно, т.к. я там заменил ввод с клавиатуры на присваивание: Код: plaintext 1.
Выделение памяти думал если убрать: Код: plaintext 1.
то ошибка будет. А нет, ошибки нет, вы правы. Все убрал как вы сказали. Только осталось мерность повысить у массива ) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 14:39 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Можно выделять память проще, быстрее и эффективней Вот тоже самое с двумя malloc()Комментарии написал, надеюсь поймешь Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Можно одним malloc() обойтись, но это уже изврат будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 14:50 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
В общем, добавил константу: Код: plaintext 1.
Добавил 3-хмерный массив и выделение для него памяти: Код: plaintext 1.
Все остальное выделение памяти поместил в цикл: Код: plaintext 1. 2. 3. 4. 5.
Вот так компилируется и даже запускается без ошибок: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62.
Подскажите, я в том направлении двигаюсь? И как обращаться к отдельному элементу массива? если заменяю: Код: plaintext 1. 2. 3.
то ошибка str7.c:28:22: warning: assignment makes integer from pointer without a cast [enabled by default] stroka[x][i] = (char*)malloc(N*sizeof(char)); И при присвоении если вместо Код: plaintext 1. 2. 3.
str7.c:40:8: error: ‘stroka’ undeclared (first use in this function) strcpy(stroka[0][i],"stroka"); ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 15:12 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Откуда stolbetc взялся? Надо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Комментарии не ленись писать по существу ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 15:22 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Откуда stolbetc взялся? Надо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Комментарии не ленись писать по существу а, stroka так и остается, только на нее указатель... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 15:30 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Тут ты просто устроил утечку памяти Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 15:35 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ а, stroka так и остается, только на нее указатель... так и остается, только было stroka[i] а стало stroka[x][i] т.к. ты еще один уровень вложенности добавил ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 15:37 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Тут ты просто устроил утечку памяти Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Так и есть: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.
А как сделать чтобы указатель не терялся? Я подозреваю что вместо: Код: plaintext 1.
надо что-то типа этого использовать: Код: plaintext 1.
Но если так указать то компилятор ругается: str7.c: In function ‘main’: str7.c:21:12: warning: assignment from incompatible pointer type [enabled by default] *stroka[x] = (char**)malloc(K*sizeof(char)); ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2022, 17:14 |
|
|
start [/forum/topic.php?fid=57&msg=40129577&tid=2017122]: |
0ms |
get settings: |
16ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
46ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
570ms |
get tp. blocked users: |
1ms |
others: | 3243ms |
total: | 3890ms |
0 / 0 |