The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Помогите разобраться с Си "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Помогите разобраться с Си "  +/
Сообщение от фдуч320388 email(ok) on 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. ААААА

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Помогите разобраться с Си "  +/
Сообщение от XAnder (ok) on 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] указывает на строковую константу, а вы туда пытаетесь писать. А константа располагается в блоке памяти, доступном только на чтение.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Помогите разобраться с Си "  +/
Сообщение от Аноним (??) on 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]);
}

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Помогите разобраться с Си "  +/
Сообщение от pavlinux (ok) on 11-Сен-12, 04:22 
> будет работать:

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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "Помогите разобраться с Си "  +/
Сообщение от pavlinux (ok) on 13-Сен-12, 02:23 
> И как тут не обрести снова веру в человечество?

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


Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

6. "Помогите разобраться с Си "  +/
Сообщение от pavlinux (ok) on 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))»

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

2. "Помогите разобраться с Си "  –2 +/
Сообщение от pavlinux (ok) on 10-Сен-12, 03:12 
> while (a[0][0][i] != '\0')
> {
> if (a[0][0][i] == '+') a[0][0][i] =' ';
> i++;

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

8. "Помогите разобраться с Си "  –1 +/
Сообщение от pavlinux (ok) on 11-Сен-12, 04:25 
А бля, гопота на сайте, минусами закидали!!! :)

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру