Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2018, 16:44   #11
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
Сообщение от Sinli Посмотреть сообщение
это компилятор мне не позволил сделать.
Я не так просил...

Цитата:
Сообщение от Sinli Посмотреть сообщение
Выполнение программы повлекло
И? Появились мысли почему и откуда?
p51x вне форума Ответить с цитированием
Старый 10.10.2018, 16:44   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
Сообщение от Sinli Посмотреть сообщение
Переписал вот так
Добавить еще кучу проверок вместо исправления условия цикла - оригинально и показательно...
p51x вне форума Ответить с цитированием
Старый 11.10.2018, 00:22   #13
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

переделал еще раз:
Код:
char * charfind (char *st, char cr)
{
        char * needtofind;
        int i = 0;
        while (st[i] != cr && st[i] != '\0' && st != NULL)
                i++;
        if (st[i] == '\0' || st == NULL)
                needtofind = NULL;
        else
                needtofind = &st[i];
        return needtofind;
}
Но этот код уже не работает. Опять выводит ошибку сегментации. Почему, не могу понять, вроде все логично выглядит.

Извините, если раздражаю своей писаниной.
Sinli вне форума Ответить с цитированием
Старый 11.10.2018, 01:04   #14
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И? Появились мысли почему и откуда?
Я тут провел пару небольших экспериментов, чтобы понять почему.
Сначала предположил, что это происходит, когда мы пытаемся вывести переменную, у которой нет значения:
Код:
#include <stdio.h>
int number(void);
int main(void)
{
        int x;
        x = number(5);
        printf("%d\n", x);
        return 0;
}
int number(void)
{
        int y;
        if (n > 10)
                y = 5;
        return y;
}
Но программа вывела значение 0.

Тогда я сделал так:
Код:
#include <stdio.h>
int *number(int);
int main(void)
{
        int *x;
        x = number(5);
        printf("%d\n", *x);
        return 0;
}
int *number(int n)
{
        int *y;
        if (n > 10)
                *y = 5;
        return y;
}
И выпала ошибка сегментации.
Выходит подобная ошибка выпадает, когда мы пытаемся разыменовать указатель, которому не назначили никакого адреса.

В итоге это тоже дает ту же ошибку:
Код:
#include <stdio.h>
int main(void)
{
        int *x;
        printf("%d\n", *x);
        return 0;
}
Sinli вне форума Ответить с цитированием
Старый 11.10.2018, 08:29   #15
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Ну так вы условие цикла исправили?
p51x вне форума Ответить с цитированием
Старый 11.10.2018, 12:22   #16
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Было так:
Код:
char * charfind (char *st, char cr)
{
        char * needtofind;
        int i = 0;
        while (st[i] != cr && st[i] != '\0')
                i++;
        if (st[i] == '\0')
                needtofind = NULL;
        else
                needtofind = &st[i];
        return needtofind;
}
А теперь так:
Код:
char * charfind (char *st, char cr)
{
        char * needtofind;
        int i = 0;
        while (st[i] != cr && st[i] != '\0' && st != NULL)
                i++;
        if (st[i] == '\0' || st == NULL)
                needtofind = NULL;
        else
                needtofind = &st[i];
        return needtofind;
}
Вы ведь про цикл while говорите?
Sinli вне форума Ответить с цитированием
Старый 11.10.2018, 12:24   #17
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Ну оно же все равно упадет...
p51x вне форума Ответить с цитированием
Старый 11.10.2018, 12:54   #18
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Почему?!
Если передается нулевой указатель, то благодаря st != NULL цикл while должен прекратиться. Далее условие st == NULL, присваивает needtofind значение нулевого указателя.
Что я не вижу? Я что-то неправильно сделал с логическими операциями?
Sinli вне форума Ответить с цитированием
Старый 11.10.2018, 13:02   #19
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
Сообщение от Sinli Посмотреть сообщение
Если передается нулевой указатель, то благодаря st != NULL цикл while должен прекратиться.
Но до этого вы же его фактически разыменуете... Аж дважды...
p51x вне форума Ответить с цитированием
Старый 11.10.2018, 13:34   #20
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Блин... st[i]...
Т.е. все, что надо было это поставить проверку на NULL первой?
В таком случае до второй и третьей проверок дело не доходит.
Код:
char * charfind (char *st, char cr)
{
        char * needtofind;
        int i = 0;
        while (st != NULL && st[i] != cr && st[i] != '\0')
                i++;
        if (st == NULL || st[i] == '\0')
                needtofind = NULL;
        else
                needtofind = &st[i];
        return needtofind;
}
Нашел это в книге.
Скриншот 2018-10-11 13_26_18.png

И еще, насчет этого NULL
Когда мы пишем функцию, которая принимает и/или возвращает указатель, то мы всегда должны предусматривать вариант, когда она получает/возвращает нулевой указатель?
Sinli вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с указателями. Sinli Общие вопросы C/C++ 2 04.10.2018 22:47
Помогите пожалуйста разобраться с указателями? седьмой Общие вопросы C/C++ 20 18.04.2017 07:26
помогите разобраться с указателями С++ sasha_14-88 Общие вопросы C/C++ 1 07.12.2014 10:39
Помогите разобраться с указателями igole Общие вопросы C/C++ 1 28.04.2013 16:47
Товарищи, помогите разобраться с указателями scibern Общие вопросы C/C++ 7 11.01.2009 12:28