Гость
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива / 25 сообщений из 308, страница 1 из 13
26.01.2022, 10:30
    #40129490
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Доброе утро.

Продолжаю разбираться с Си.

Требуется сделать двухмерный текстовый массив.

В принципе он создается нормально.

Но когда добавил 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>



int
main()
{
char* massive_var[0][0]; 
massive_var[0][0] = (char*)calloc(10000, sizeof(char));
massive_var[0][0] = "first_record";
printf("%s \n", massive_var[0][0]);

free(massive_var[0][0]);

    return 0;
}






Подскажите пожалуйста как правильно освободить память у ячейки двухмерного массива?

Ну и у всего массива.
...
Рейтинг: 0 / 0
26.01.2022, 10:49
    #40129504
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Тебе точно С надо? Может С++ задействовать?

Это совсем не то что ты думаешь
Код: plaintext
1.
char* massive_var[0][0];


если честно я сам не готов объяснить почему это скомпилировалось, наверно потому что это Си
...
Рейтинг: 0 / 0
26.01.2022, 10:53
    #40129505
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Уткъ,

Гуглить. Курсы по Си. Массивы
...
Рейтинг: 0 / 0
26.01.2022, 11:19
    #40129518
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Siemargl
Уткъ,

Гуглить. Курсы по Си. Массивы



тут нашел пример, последнее сообщение
https://www.cyberforum.ru/c-beginners/thread2496725.html


массив объявляется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //динамическое выделение памяти для одномерного массива
    char *slov = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char **slay = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        slay[i] = (char*)malloc(N*sizeof(char));
    }



но непонятно это верно или нет.


Может есть какой-нибудь пример как надо делать?
...
Рейтинг: 0 / 0
26.01.2022, 11:20
    #40129521
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Dima T
Тебе точно С надо? Может С++ задействовать?

Это совсем не то что ты думаешь
Код: plaintext
1.
char* massive_var[0][0];


если честно я сам не готов объяснить почему это скомпилировалось, наверно потому что это Си





другие элементы всталял - работает.

но раз это не то что надо, как-то по-другому придется.

:-(
...
Рейтинг: 0 / 0
26.01.2022, 11:42
    #40129534
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Уткъ
Siemargl
Уткъ,

Гуглить. Курсы по Си. Массивы



тут нашел пример, последнее сообщение
https://www.cyberforum.ru/c-beginners/thread2496725.html


массив объявляется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //динамическое выделение памяти для одномерного массива
    char *slov = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char **slay = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        slay[i] = (char*)malloc(N*sizeof(char));
    }



но непонятно это верно или нет.


Может есть какой-нибудь пример как надо делать?



В общем, в этом примере двумерный массив, но одна мерность занимает строка, т.е. по сути это это одномерный массив из строк.

Ищу дальше.
...
Рейтинг: 0 / 0
26.01.2022, 11:54
    #40129538
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Dima T
Тебе точно С надо? Может С++ задействовать?

Это совсем не то что ты думаешь
Код: plaintext
1.
char* massive_var[0][0];


если честно я сам не готов объяснить почему это скомпилировалось, наверно потому что это Си







Работало т.к. по первому символу как-то вся строка вытаскивалась наверное.

Смотрите, это получился двухмерный массив из сиволов (не строк).

Т.е. чтобы это был массив из строк надо вместо char* указать строку, наверное свой тип создать надо.
...
Рейтинг: 0 / 0
26.01.2022, 12:41
    #40129552
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
сделал 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

int main()
{

 char massive[1][3][30];
  
  strcpy(massive[0][0],"a0");
  strcpy(massive[0][1],"a1");
  strcpy(massive[0][2],"a2");
  strcpy(massive[1][0],"b0");
  strcpy(massive[1][1],"b1");
  strcpy(massive[1][2],"b2");

printf("%s   %s   %s \n",massive[0][0],massive[0][1],massive[0][2]);
printf("%s   %s   %s \n",massive[1][0],massive[1][1],massive[1][2]);

return 0;
}





Вывод:

Код: plaintext
1.
2.
a0   a1   a2
b0   b1   b2




Но тут хочется strcpy поменять на calloc + присваивание (=)


и в объявлении массива использовать не char а char*


пока это не получилось.
...
Рейтинг: 0 / 0
26.01.2022, 13:04
    #40129565
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Уткъ
Siemargl
Уткъ,

Гуглить. Курсы по Си. Массивы



тут нашел пример, последнее сообщение
https://www.cyberforum.ru/c-beginners/thread2496725.html


массив объявляется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //динамическое выделение памяти для одномерного массива
    char *slov = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char **slay = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        slay[i] = (char*)malloc(N*sizeof(char));
    }



но непонятно это верно или нет.


Может есть какой-нибудь пример как надо делать?

Все тут верно. Только учти что это не двухмерный массив, а массив массивов, точнее массив строк, т.к. строка это массив символов.

Хотя ты тоже массив массивов хочешь, двумерный массив так объявляется:
Код: plaintext
1.
char arr[10,20];



PS Тебе точно Си надо? Если да, то сначала теорию почитай, книжку какую-нибудь, т.к. это азы, без их знания ничего путного не напишешь.
...
Рейтинг: 0 / 0
26.01.2022, 13:28
    #40129577
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Dima T
Уткъ
пропущено...



тут нашел пример, последнее сообщение
https://www.cyberforum.ru/c-beginners/thread2496725.html


массив объявляется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //динамическое выделение памяти для одномерного массива
    char *slov = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char **slay = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        slay[i] = (char*)malloc(N*sizeof(char));
    }



но непонятно это верно или нет.


Может есть какой-нибудь пример как надо делать?

Все тут верно. Только учти что это не двухмерный массив, а массив массивов, точнее массив строк, т.к. строка это массив символов.

Хотя ты тоже массив массивов хочешь, двумерный массив так объявляется:
Код: plaintext
1.
char arr[10,20];



PS Тебе точно Си надо? Если да, то сначала теорию почитай, книжку какую-нибудь, т.к. это азы, без их знания ничего путного не напишешь.


Ритчи бегло прочел.

Так не дает объявить:

Код: plaintext
1.
 char massive[1,3];



str5.c: In function ‘main’:
str5.c:11:16: error: expected ‘]’ before ‘,’ token
char massive[1,3];



А вот этот вариант нормальный?
22426237

Мне там только надо сделать чтобы массив можно было вне функции main тоже использовать, для этого, как я понял надо не char а char*
...
Рейтинг: 0 / 0
26.01.2022, 13:42
    #40129584
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Уткъ
str5.c: In function ‘main’:
str5.c:11:16: error: expected ‘]’ before ‘,’ token
char massive[1,3];

Похоже тут уже я напутал, это из C#, нет в С/С++ двумерных массивов. Есть только массивы массивов.

Уткъ
Ритчи бегло прочел.

Очень бегло похоже. Иначе не было бы этого вопроса:
Уткъ
Мне там только надо сделать чтобы массив можно было вне функции main тоже использовать, для этого, как я понял надо не char а char*

Читай про указатели. Очень внимательно читай, т.к. кроме С/С++ их нигде нет, а на них строится вся работа с памятью.

Указатель (char*) это массив, указатель на массив указателей (char**) это массив массивов (двумерный) и т.д.

Читай книжку чтобы нам сюда ее не перепечатывать.
...
Рейтинг: 0 / 0
26.01.2022, 13:58
    #40129587
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Уткъ

Требуется сделать двухмерный текстовый массив.

Здесь немножко есть терминологическая путаница и срыв шаблона. В С строки всегда повышают -мерность
коллекции. Тоесть 1-мерный массив строк - это 2-мерный (зубчатый) массив chars. И так далее.

Вообще если варьировать количество звездочек перед указателем то ты можешь варьировать мерность
коллекции.

Например

Код: plaintext
1.
char *p; // указатель на массив символов (или 1 строка)



или

Код: plaintext
1.
char **p; // указатель на массив указателей на массив символов (или массив строк)



в функции main например второй аргумент как раз прилетает в виде такого массива.

и так далее

Код: plaintext
1.
char ***p; // три уровня вложенности указателей (матрица рядков произвольной длины, где в каждом элементе - строка)



аллокацию такого массива делают по-слоям. Тоесть сначала слой внешний. Потов второй. И потом строчки.

Альтренатива зубчатости - это прямоугольная матрица. Но это подходит для строк фиксированного размера. Например
номера телефонов. Если средняя длина телефона 7 цифр (в локальной городской сети)
то для хранения 1000 телефонов тебе достаточно будет выделять 1000 * (7 + 1) символов.

Или многомерная матрица с теми-же явными лимитами. Куб. Например Куб телефонных номеров по всем городам.
Допустим гордов 15. Тогда надо аллоцировать 15 * 1000 * (7 + 1) символов.

Для таких кубов и гипер-кубов нам нужен только один указатель.

Код: plaintext
1.
char *p; // левый верхний угол матрицы или куба 



Куб экономит память только для лимитированных строчек. Навигацию по кубу можно просто делать по формуле
остчитывая расстояние от левого верхнего угла в символах.

Для языков С/C++ существует аналогия между указателем и именем массива. Недавно на эту тему был
очень жаркий спор. Не хотелось-бы углубляться.
...
Рейтинг: 0 / 0
26.01.2022, 14:16
    #40129593
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
mayton
Уткъ

Требуется сделать двухмерный текстовый массив.

Здесь немножко есть терминологическая путаница и срыв шаблона. В С строки всегда повышают -мерность
коллекции. Тоесть 1-мерный массив строк - это 2-мерный (зубчатый) массив chars. И так далее.

Вообще если варьировать количество звездочек перед указателем то ты можешь варьировать мерность
коллекции.

Например

Код: plaintext
1.
char *p; // указатель на массив символов (или 1 строка)



или

Код: plaintext
1.
char **p; // указатель на массив указателей на массив символов (или массив строк)



в функции main например второй аргумент как раз прилетает в виде такого массива.

и так далее

Код: plaintext
1.
char ***p; // три уровня вложенности указателей (матрица рядков произвольной длины, где в каждом элементе - строка)



аллокацию такого массива делают по-слоям. Тоесть сначала слой внешний. Потов второй. И потом строчки.

Альтренатива зубчатости - это прямоугольная матрица. Но это подходит для строк фиксированного размера. Например
номера телефонов. Если средняя длина телефона 7 цифр (в локальной городской сети)
то для хранения 1000 телефонов тебе достаточно будет выделять 1000 * (7 + 1) символов.

Или многомерная матрица с теми-же явными лимитами. Куб. Например Куб телефонных номеров по всем городам.
Допустим гордов 15. Тогда надо аллоцировать 15 * 1000 * (7 + 1) символов.

Для таких кубов и гипер-кубов нам нужен только один указатель.

Код: plaintext
1.
char *p; // левый верхний угол матрицы или куба 



Куб экономит память только для лимитированных строчек. Навигацию по кубу можно просто делать по формуле
остчитывая расстояние от левого верхнего угла в символах.

Для языков С/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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define M 5 //строки в массиве
#define N 100 // допустимое колличесвто элементов в строке


int main()
{

    //переменные для итерации
    int i,j=0;
    //динамическое выделение памяти для одномерного массива
    char* element = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/
    for(i=0;i<M;i++)
    {
//stroka[i]=strcat("sroka",(char*)i);
strcpy(stroka[i],"stroka");
    }
    printf("Вывод массива на консоль: \n");
    for(i=0;i<M;i++)
    {
        printf("%s\n",stroka[i]);
    }
    //высвобождение памяти от предусмотренного колличесва элементов в массиве 
    for(i=0;i<M;i++)
        free(stroka[i]);
    //высвобождение памяти от указателя на строки(на первый элемент массива) 
    free(stroka);
 
    return 0;
}
...
Рейтинг: 0 / 0
26.01.2022, 14:18
    #40129594
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-(
...
Рейтинг: 0 / 0
26.01.2022, 14:25
    #40129600
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Это лишнее
Код: plaintext
1.
2.
    char* element = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");


В примере было два выделения массива. Это одномерный, у тебя не используется.

в остальном нормальный код 22426300
...
Рейтинг: 0 / 0
26.01.2022, 14:30
    #40129604
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Уткъ
Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-(

Ты-же копируешь на линуксы и там собираешь? Тогда гоняй valgrind каждый раз при каждом запуске.
Это будет лакмусовая бумажка. Как только что-то не то с утечкой или доступом по неаллоцированому - ты получишь
желтую карточку.
...
Рейтинг: 0 / 0
26.01.2022, 14:37
    #40129608
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
mayton
Уткъ
Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-(

Ты-же копируешь на линуксы и там собираешь? Тогда гоняй valgrind каждый раз при каждом запуске.
Это будет лакмусовая бумажка. Как только что-то не то с утечкой или доступом по неаллоцированому - ты получишь
желтую карточку.


Да, так и есть, копирую и там собираю.

valgrind , почитаю, спасибо )
...
Рейтинг: 0 / 0
26.01.2022, 14:39
    #40129611
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Dima T
Это лишнее
Код: plaintext
1.
2.
    char* element = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");


В примере было два выделения массива. Это одномерный, у тебя не используется.

в остальном нормальный код 22426300



Это убрать, понятно, т.к. я там заменил ввод с клавиатуры на присваивание:
Код: plaintext
1.
    printf("Введите массив: \n");




Выделение памяти думал если убрать:
Код: plaintext
1.
    char* element = (char*)malloc(N*sizeof(char));



то ошибка будет.

А нет, ошибки нет, вы правы.

Все убрал как вы сказали.



Только осталось мерность повысить у массива )
...
Рейтинг: 0 / 0
26.01.2022, 14:50
    #40129614
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Можно выделять память проще, быстрее и эффективней
Вот тоже самое с двумя 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.
int main() {
    // Массив указателей
    char** stroka = (char**)malloc(M * sizeof(char*));
    //Память под M строк по N символов
    stroka[0] = (char*)malloc(M * N * sizeof(char));
    // Заполнение массива указателями на строки
    for (int i = 1; i < M; i++) {
        stroka[i] = stroka[i-1] + N;
    }
    // Заполнение массива
    for (int i = 0; i < M; i++) {
        strcpy(stroka[i], "stroka   ");
        stroka[i][7] = '0' + i;
    }
    printf("Вывод массива на консоль: \n");
    for (int i = 0;i < M;i++) {
        printf("%s\n", stroka[i]);
    }
    //высвобождение памяти для строк
    free(stroka[0]); // можно писать free(*stroka)
    //высвобождение памяти под массив указателей на строки
    free(stroka);

    return 0;
}


Можно одним malloc() обойтись, но это уже изврат будет.
...
Рейтинг: 0 / 0
26.01.2022, 15:12
    #40129624
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
В общем, добавил константу:

Код: plaintext
1.
#define K 2 //количество строк



Добавил 3-хмерный массив и выделение для него памяти:

Код: plaintext
1.
	char*** stolbetc = (char***)malloc(K*sizeof(char**)); 




Все остальное выделение памяти поместил в цикл:

Код: plaintext
1.
2.
3.
4.
5.
for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
...
}





Вот так компилируется и даже запускается без ошибок:




Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define K 2 //строк
#define M 5 //количество столбцов
#define N 100 // максимальная длинна строки


int main()
{

    //переменные для итерации
    int i,j,x=0;

	//выделение памяти для 3-мерного массива
	char*** stolbetc = (char***)malloc(K*sizeof(char**)); //выделение памяти для указателя на строки(первого элемента в массиве)

for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

}

/*

    for(i=0;i<M;i++)
    {
//stroka[i]=strcat("sroka",(char*)i);
strcpy(stroka[i],"stroka");
    }
    printf("Вывод массива на консоль: \n");
    for(i=0;i<M;i++)
    {
        printf("%s\t",stroka[i]);
    }




	printf("\n");
    //высвобождение памяти от предусмотренного колличесва элементов в массиве 
    for(i=0;i<M;i++)
        free(stroka[i]);
    //высвобождение памяти от указателя на строки(на первый элемент массива) 
    free(stroka);

*/

	
    return 0;
}








Подскажите, я в том направлении двигаюсь?


И как обращаться к отдельному элементу массива?


если заменяю:
Код: plaintext
1.
2.
3.
stroka[i] = (char*)malloc(N*sizeof(char));
на
stroka[x][i] = (char*)malloc(N*sizeof(char));



то ошибка

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.
strcpy(stroka[i],"stroka");
это:
strcpy(stroka[0][i],"stroka");



str7.c:40:8: error: ‘stroka’ undeclared (first use in this function)
strcpy(stroka[0][i],"stroka");
...
Рейтинг: 0 / 0
26.01.2022, 15:22
    #40129631
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Откуда stolbetc взялся? Надо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Массив указателей на массивы указателей на строки
char*** stroka = (char***)malloc(K*sizeof(char**));
// Заполнение 
for(x=0;x<K;x++)
{
    //далее будет выделятся память для двумерного массива		
    stroka[x] = (char**)malloc(M*sizeof(char*));
...


Комментарии не ленись писать по существу
...
Рейтинг: 0 / 0
26.01.2022, 15:30
    #40129635
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Dima T
Откуда stolbetc взялся? Надо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Массив указателей на массивы указателей на строки
char*** stroka = (char***)malloc(K*sizeof(char**));
// Заполнение 
for(x=0;x<K;x++)
{
    //далее будет выделятся память для двумерного массива		
    stroka[x] = (char**)malloc(M*sizeof(char*));
...


Комментарии не ленись писать по существу



а, stroka так и остается, только на нее указатель...
...
Рейтинг: 0 / 0
26.01.2022, 15:35
    #40129639
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Тут ты просто устроил утечку памяти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделили память
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

} // потерял указатель на эту память, т.к. конец зоны видимости переменной stroka 
...
Рейтинг: 0 / 0
26.01.2022, 15:37
    #40129640
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Уткъ
а, stroka так и остается, только на нее указатель...

так и остается, только было stroka[i] а стало stroka[x][i] т.к. ты еще один уровень вложенности добавил
...
Рейтинг: 0 / 0
26.01.2022, 17:14
    #40129691
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си. Освободить память 2-мерного сторкового массива
Dima T
Тут ты просто устроил утечку памяти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделили память
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

} // потерял указатель на эту память, т.к. конец зоны видимости переменной stroka 










Так и есть:





Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define K 2 //количество строк
#define M 5 //количество столбцов
#define N 100 // максимальная длинна строки


int main()
{

    //переменные для итерации
    int i,j,x=0;

	//выделение памяти для 3-мерного массива
	char*** stroka = (char***)malloc(K*sizeof(char**)); 

for(x=0;x<K;x++)
{
stroka[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

	
//ТУТ НОРМАЛЬНО ПРИСВАИВАЕТ И ВЫВЫОДИТ	
strcpy(stroka[x],"stroka");	
printf("%s\n",stroka[x]);	
}

//ТУТ Segmentation fault
strcpy(stroka[0][0],"stroka");



/*

    for(i=0;i<M;i++)
    {
//stroka[i]=strcat("sroka",(char*)i);
strcpy(stroka[0][i],"stroka");
    }
    printf("Вывод массива на консоль: \n");
    for(i=0;i<M;i++)
    {
        printf("%s\t",stroka[0][i]);
    }


	printf("\n");
    //высвобождение памяти от предусмотренного колличесва элементов в массиве 
    for(i=0;i<M;i++)
        free(stroka[i]);
    //высвобождение памяти от указателя на строки(на первый элемент массива) 
    free(stroka);

*/

	
    return 0;
}






А как сделать чтобы указатель не терялся?


Я подозреваю что вместо:

Код: plaintext
1.
stroka[x] = (char**)malloc(K*sizeof(char));




надо что-то типа этого использовать:

Код: plaintext
1.
*stroka[x] = (char**)malloc(K*sizeof(char));




Но если так указать то компилятор ругается:

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));
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива / 25 сообщений из 308, страница 1 из 13
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]