URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8518
[ Назад ]

Исходное сообщение
"char **str = malloc.... пытаюсь научиться использовать динамиче"

Отправлено myxa , 19-Ноя-09 13:23 

   int i;
   char **str = (char**) malloc (10 * sizeof(char*));

   for( i = 0; i < 10; i++ )
      {
        str[i] = (char*) malloc (256 * sizeof(char));
        strcpy(str[i],"myxa");
      }

  for( i = 0; i < 10; i++ )
      {
       free(str[i]);
      }
  free(str);

кусок выше работает
если сделать присвоение то на этапе запуска прога улетает в дамп
str[i]="myxa";


Содержание

Сообщения в этом обсуждении
"char **str = malloc.... пытаюсь научиться использовать динам..."
Отправлено phpcoder , 19-Ноя-09 13:32 
>кусок выше работает
>если сделать присвоение то на этапе запуска прога улетает в дамп
>str[i]="myxa";

Потому что при присвоении строки вы присваиваете не строку, а адрес на эту строку. Причем, эта строка константная и находится в специальном сегменте памяти, доступном только для чтения. Вызывать для этого указателя free() это ошибка, которая и приводит к аварийному завершению программы.


"char **str = malloc.... пытаюсь научиться использовать динам..."
Отправлено myxa , 19-Ноя-09 13:34 
>>кусок выше работает
>>если сделать присвоение то на этапе запуска прога улетает в дамп
>>str[i]="myxa";
>
>Потому что при присвоении строки вы присваиваете не строку, а адрес на
>эту строку. Причем, эта строка константная и находится в специальном сегменте
>памяти, доступном только для чтения. Вызывать для этого указателя free() это
>ошибка, которая и приводит к аварийному завершению программы.

Спасибо!!!!


"char **str = malloc.... пытаюсь научиться использовать динам..."
Отправлено Аноним , 19-Ноя-09 13:39 
А не проще stl?

std::vector<std::string> strv;
strv.resize(10);
for (int i=0; i<10; i++)
strv[i] = "myxa";


"char **str = malloc.... пытаюсь научиться использовать динам..."
Отправлено phpcoder , 19-Ноя-09 13:44 
>А не проще stl?

К сожалению, автор не указал на чем он пишет -- С или С++ (и можно ли ему использовать STL).


P.S. кстати это

>        str[i] = (char*) malloc (256 * sizeof(char));
>        strcpy(str[i],"myxa");

можно заменить на

>        str[i] = strdup("myxa");

Ну и результат malloc() (или strdup()) неплохо бы проверять также.


"char **str = malloc.... пытаюсь научиться использовать динам..."
Отправлено myxa , 19-Ноя-09 13:45 
>А не проще stl?
>
>std::vector<std::string> strv;
>strv.resize(10);
>for (int i=0; i<10; i++)
> strv[i] = "myxa";

Проще ... спору нет... но не панимая основ далеко не уедешь