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

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

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

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

Но когда добавил 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
Си. Освободить память 2-мерного сторкового массива
    #40129504
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе точно С надо? Может С++ задействовать?

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


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

Гуглить. Курсы по Си. Массивы
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129518
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Си. Освободить память 2-мерного сторкового массива
    #40129521
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Тебе точно С надо? Может С++ задействовать?

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


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





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

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

:-(
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129534
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уткъ
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
Си. Освободить память 2-мерного сторкового массива
    #40129538
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Тебе точно С надо? Может С++ задействовать?

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


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







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

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

Т.е. чтобы это был массив из строк надо вместо char* указать строку, наверное свой тип создать надо.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129552
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделал 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
Си. Освободить память 2-мерного сторкового массива
    #40129565
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
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
Си. Освободить память 2-мерного сторкового массива
    #40129577
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Си. Освободить память 2-мерного сторкового массива
    #40129584
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
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
Си. Освободить память 2-мерного сторкового массива
    #40129587
Фотография 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++ существует аналогия между указателем и именем массива. Недавно на эту тему был
очень жаркий спор. Не хотелось-бы углубляться.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129593
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Си. Освободить память 2-мерного сторкового массива
    #40129594
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-(
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129600
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это лишнее
Код: plaintext
1.
2.
    char* element = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");


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

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

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

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


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

valgrind , почитаю, спасибо )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129611
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Си. Освободить память 2-мерного сторкового массива
    #40129614
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно выделять память проще, быстрее и эффективней
Вот тоже самое с двумя 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
Си. Освободить память 2-мерного сторкового массива
    #40129624
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, добавил константу:

Код: 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
Си. Освободить память 2-мерного сторкового массива
    #40129631
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*));
...


Комментарии не ленись писать по существу
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129635
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Си. Освободить память 2-мерного сторкового массива
    #40129639
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 
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129640
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
а, stroka так и остается, только на нее указатель...

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


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