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";
>кусок выше работает
>если сделать присвоение то на этапе запуска прога улетает в дамп
>str[i]="myxa";Потому что при присвоении строки вы присваиваете не строку, а адрес на эту строку. Причем, эта строка константная и находится в специальном сегменте памяти, доступном только для чтения. Вызывать для этого указателя free() это ошибка, которая и приводит к аварийному завершению программы.
>>кусок выше работает
>>если сделать присвоение то на этапе запуска прога улетает в дамп
>>str[i]="myxa";
>
>Потому что при присвоении строки вы присваиваете не строку, а адрес на
>эту строку. Причем, эта строка константная и находится в специальном сегменте
>памяти, доступном только для чтения. Вызывать для этого указателя free() это
>ошибка, которая и приводит к аварийному завершению программы.Спасибо!!!!
А не проще stl?std::vector<std::string> strv;
strv.resize(10);
for (int i=0; i<10; i++)
strv[i] = "myxa";
>А не проще stl?К сожалению, автор не указал на чем он пишет -- С или С++ (и можно ли ему использовать STL).
P.S. кстати это> str[i] = (char*) malloc (256 * sizeof(char));
> strcpy(str[i],"myxa");можно заменить на
> str[i] = strdup("myxa");
Ну и результат malloc() (или strdup()) неплохо бы проверять также.
>А не проще stl?
>
>std::vector<std::string> strv;
>strv.resize(10);
>for (int i=0; i<10; i++)
> strv[i] = "myxa";Проще ... спору нет... но не панимая основ далеко не уедешь