Не могу понять почему ошибка в коде:#include <stdio.h>
#include <string.h>char * a[1][2] = { {"1. ААААА +","2. БББ"} };
int main(void)
{int i = 0;
printf("First String : %s\n", *&a[0][0]);
while (a[0][0][i] != '\0')
{
if (a[0][0][i] == '+') a[0][0][i] =' ';
i++;
}
printf("New String : %s\n", a[0][0]);return 0;
}Он вьідает
First String : 1. ААААА +
Segmentation faultа должен
First String : 1. ААААА +
New String : 1. ААААА
> Не могу понять почему ошибка в коде:
> int i = 0;
> printf("First String : %s\n", *&a[0][0]);
> while (a[0][0][i] != '\0')
> {
> if (a[0][0][i] == '+') a[0][0][i] =' ';Вот на этом месте и сегфолтится: a[0][0] указывает на строковую константу, а вы туда пытаетесь писать. А константа располагается в блоке памяти, доступном только на чтение.
>> if (a[0][0][i] == '+') a[0][0][i] =' ';
> Вот на этом месте и сегфолтится: a[0][0] указывает на строковую константу,
> А константа располагается в блоке памяти, доступном только на чтение.В лине можно и константы переписывать ;)
>>> if (a[0][0][i] == '+') a[0][0][i] =' ';
>> Вот на этом месте и сегфолтится: a[0][0] указывает на строковую константу,
>> А константа располагается в блоке памяти, доступном только на чтение.
> В лине можно и константы переписывать ;)Другие объяснения ситуации? Сегфолт-то тут действительно возникает — проверено. Причём именно в том месте, на которое я указал.
>>>> if (a[0][0][i] == '+') a[0][0][i] =' ';
>>> Вот на этом месте и сегфолтится: a[0][0] указывает на строковую константу,
>>> А константа располагается в блоке памяти, доступном только на чтение.
>> В лине можно и константы переписывать ;)
> Другие объяснения ситуации? Сегфолт-то тут действительно возникает — проверено.
> Причём именно в том месте, на которое я указал.под валгриндом запусти, нет полномочий для записи в константу, поэтому и сегфалт.
будет работать:
int main(void)
{char * a[1][2] = { {strdup("1. ААААА +"),"2. БББ"} };
int i = 0;
printf("First String : %s\n", *&a[0][0]);
while (a[0][0][i] != '\0')
{
if (a[0][0][i] == '+')
a[0][0][i] =' ';
i++;
}
printf("New String : %s\n", a[0][0]);
}
> будет работать:Ага, с утечкой памяти! :)
> char * a[1][2] = { {strdup("1. ААААА +"),"2. БББ"} };
>
>> будет работать:
> Ага, с утечкой памяти! :)
>> char * a[1][2] = { {strdup("1. ААААА +"),"2. БББ"} };
>>Помнится, совсем недавно павлин собирался вместо маллок мадвайс использовать, а сейчас уже знает, что после маллок надо фри вызывать. И как тут не обрести снова веру в человечество?
> И как тут не обрести снова веру в человечество?Ну вот такая я не постоянная, ну мадваиз все равно круче! :)
> Другие объяснения ситуации?А чё тут думать, const надо писать перед char *a[1][2] = ... и всё станет ясно.
error: assignment of read-only location «*(a[0][0] + (long unsigned int)((long unsigned int)i * 1ul))»
> while (a[0][0][i] != '\0')
> {
> if (a[0][0][i] == '+') a[0][0][i] =' ';
> i++;Можна тупой уапрос, нафига юзать 3-мерные индексы,
если массив инициализировался как 2-мерный? Иль вас так преподы дрючат?
Для посимвольного сравнения можно как-то по аккуратней нарисовать
А бля, гопота на сайте, минусами закидали!!! :)