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

Исходное сообщение
"Помогите разобраться с Си "

Отправлено фдуч320388 , 06-Сен-12 15:43 
Не могу понять почему ошибка в коде:

#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. ААААА


Содержание

Сообщения в этом обсуждении
"Помогите разобраться с Си "
Отправлено XAnder , 06-Сен-12 17:55 
> Не могу понять почему ошибка в коде:
> 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] указывает на строковую константу, а вы туда пытаетесь писать. А константа располагается в блоке памяти, доступном только на чтение.


"Помогите разобраться с Си "
Отправлено pavlinux , 10-Сен-12 03:32 
>> if (a[0][0][i] == '+') a[0][0][i] =' ';
> Вот на этом месте и сегфолтится: a[0][0] указывает на строковую константу,
> А константа располагается в блоке памяти, доступном только на чтение.

В лине можно и константы переписывать ;)


"Помогите разобраться с Си "
Отправлено XAnder , 10-Сен-12 08:35 
>>> if (a[0][0][i] == '+') a[0][0][i] =' ';
>> Вот на этом месте и сегфолтится: a[0][0] указывает на строковую константу,
>> А константа располагается в блоке памяти, доступном только на чтение.
> В лине можно и константы переписывать ;)

Другие объяснения ситуации? Сегфолт-то тут действительно возникает — проверено. Причём именно в том месте, на которое я указал.


"Помогите разобраться с Си "
Отправлено Аноним , 10-Сен-12 13:49 
>>>> 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]);
}


"Помогите разобраться с Си "
Отправлено pavlinux , 11-Сен-12 04:22 
> будет работать:

Ага, с утечкой памяти! :)

> char * a[1][2] = { {strdup("1. ААААА +"),"2. БББ"} };
>


"Помогите разобраться с Си "
Отправлено Аноним , 11-Сен-12 09:30 
>> будет работать:
> Ага, с утечкой памяти! :)
>> char * a[1][2] = { {strdup("1. ААААА +"),"2. БББ"} };
>>

Помнится, совсем недавно павлин собирался вместо маллок мадвайс использовать, а сейчас уже знает, что после маллок надо фри вызывать. И как тут не обрести снова веру в человечество?


"Помогите разобраться с Си "
Отправлено pavlinux , 13-Сен-12 02:23 
> И как тут не обрести снова веру в человечество?

Ну вот такая я не постоянная, ну мадваиз все равно круче! :)



"Помогите разобраться с Си "
Отправлено pavlinux , 11-Сен-12 04:18 
> Другие объяснения ситуации?

А чё тут думать, const надо писать перед char *a[1][2] = ... и всё станет ясно.

error: assignment of read-only location «*(a[0][0] + (long unsigned int)((long unsigned int)i * 1ul))»


"Помогите разобраться с Си "
Отправлено pavlinux , 10-Сен-12 03:12 
> while (a[0][0][i] != '\0')
> {
> if (a[0][0][i] == '+') a[0][0][i] =' ';
> i++;

Можна тупой уапрос, нафига юзать 3-мерные индексы,
если массив инициализировался как 2-мерный? Иль вас так преподы дрючат?
Для посимвольного сравнения можно как-то по аккуратней нарисовать


"Помогите разобраться с Си "
Отправлено pavlinux , 11-Сен-12 04:25 
А бля, гопота на сайте, минусами закидали!!! :)