Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.12.2017
Сообщений: 14
1

Не понимаю, почему код выполняется по-разному

26.12.2018, 22:49. Показов 506. Ответов 6

Собственно, код:
C
1
2
3
4
5
6
7
8
9
10
11
typedef struct {
    char stack[32];
    int current;
} char_stack;
 
int main() {
    char_stack* st;
    st->current = 0;
 
    return 0;
}
При его выполнении моя 10 винда (компилятор gcc) выдает мне ошибку "Инструкция по адресу 0х0000... обратилась к памяти по адресу 0х000.... Память не может быть written."

Но если изменить код main:
C
1
2
3
4
5
6
7
8
int main() {
    сhar_stack* sa = (char_stack*) malloc(sizeof(char_stack));
    char_stack* st;
    st->current = 0;
    sa->current = 0;
 
    return 0;
}
То код выполнится, и никакой ошибки не будет. Каким образом создание sa вообще влияет на st?
Правильно ли я понимаю, что в первом примере код не выполняется, т.к. я объявил лишь указатель на КАКУЮ-ТО область памяти, но из-за того, что я не выделил память для нее, компилятор не понимает, что с этим указателем и инициализацией current нужно делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2018, 22:49
Ответы с готовыми решениями:

Один и тот же код выполняется по-разному
имеется код если его выполнять в visual studio 2010 то он выполняется по разному, иногда выводит ...

PHP-код выполняется по разному на разных хостах
Есть php-код, который получает от клиента на с++ post-запрос и отправляет ему миди файл: <?php...

Почему разные браузеры по-разному обрабатывают код?
Код создания запроса у меня реализован в виде функции function createRequest() { try { ...

Почему в WEB приложении и в обычном один и тот же код по разному работает?
static Boolean Auth(String data) { String dbURL =...

__________________
6
Эксперт C
25577 / 15948 / 3414
Регистрация: 24.12.2010
Сообщений: 34,883
27.12.2018, 11:19 2
Цитата Сообщение от tstein Посмотреть сообщение
Каким образом создание sa вообще влияет на st?
Не влияет. В обоих случаях в переменой st лежит какой-то случайный мусор. При выполнении оператора st->current = ... этот мусор трактуется как адрес
0
0 / 0 / 0
Регистрация: 02.12.2017
Сообщений: 14
27.12.2018, 11:36  [ТС] 3
Цитата Сообщение от Байт Посмотреть сообщение
Не влияет. В обоих случаях в переменой st лежит какой-то случайный мусор. При выполнении оператора st->current = ... этот мусор трактуется как адрес
Да, это понятно. А почему тогда во втором случае программа не падает, как в первом?
0
Эксперт C
25577 / 15948 / 3414
Регистрация: 24.12.2010
Сообщений: 34,883
27.12.2018, 11:56 4
Цитата Сообщение от tstein Посмотреть сообщение
во втором случае программа не падает, как в первом?
Ударение на слове "случайный"

Добавлено через 16 минут
Возможно, эта случайность и имеет под собой некоторую закономерность. Но она лежит не в коде вашей программы, а в действиях исполняющей системы. Возможно, она помещает 0 в первые байты стека. Зачем и почему - а кто ее знает!? Так ей почему-то удобнее.
Если хотите продолжить свои эксперименты, попробуйте во втором коде поменять местами объявления sa и st.
Только я не вижу в этом никакого смысла. Код ошибочен? - Ошибочен! Почему ведет себя по разному? А вам кто-нибудь обещал, что он будет вести себя одинаково? Хотите исследовать "черный ящик? - Бог вам в помощь!
1
452 / 232 / 49
Регистрация: 21.09.2008
Сообщений: 801
06.01.2019, 20:34 5
Цитата Сообщение от tstein Посмотреть сообщение
При его выполнении моя 10 винда (компилятор gcc) выдает мне ошибку
Всё верно. Вы объявили указатель st на структуру типа char_stack, но адрес на неё не инициализирован. И пытаетесь по неинициализированному указателю что-то получить. Естественно, получаете Segmentation fault. Но не факт, что он случится. Вполне вероятно, что указатель st с "мусорным" значением будет показывать на допустимый для чтения и записи участок памяти. Однако от этого он корректным не станет.

Цитата Сообщение от tstein Посмотреть сообщение
Но если изменить код main: То код выполнится, и никакой ошибки не будет.
Вы лукавите. GCC 5.1.0 сообщает при указании опции -Wall следующее:
XML
1
2
3
4
In function 'main':
ptr.c:11:17: error: 'st' is used uninitialized in this function [-Werror=uninitialized]
     st->current = 0;
                 ^
а при -Werror прекращает сборку:
XML
1
cc1: all warnings being treated as errors
Во втором случае указатель sa на структуру char_stack инициализирован (она размещена в памяти посредством malloc), но значение указателя st дано на откуп разработчикам компилятора. Если бы st был NULL, то Segmentation fault был бы обеспечен. Можете проверить:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdlib.h>
 
typedef struct {
    char stack[32];
    int current;
} char_stack;
 
int main() {
    char_stack* sa = (char_stack *)malloc(sizeof(char_stack));
    char_stack* st;
st = NULL;
    st->current = 0;
    sa->current = 0;
 
    return 0;
}
0
Эксперт C
25577 / 15948 / 3414
Регистрация: 24.12.2010
Сообщений: 34,883
06.01.2019, 22:30 6
sharpey, все правильно, и анализ ваш хорош. Не понимаю одного. На фига шерстить явно неправильный код. Зачем объяснять, что и как он делает, если он и впрямь идиотский? У вас есть робот? Вставьте ему в задницу отвертку. И слушайте, что он будет петь.
0
452 / 232 / 49
Регистрация: 21.09.2008
Сообщений: 801
07.01.2019, 11:40 7
Цитата Сообщение от Байт Посмотреть сообщение
Не понимаю одного. На фига шерстить явно неправильный код. Зачем объяснять, что и как он делает, если он и впрямь идиотский?
Меня всегда удивляли хакеры, которые умудрялись при явно "правильном" коде находить "дыры" в нём. До восхищения. Считайте, это такой своеобразный подход, стиль мышления.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2019, 11:40

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Считает почему то только первый код, на остальные пишет что код не найден, хотя он есть в списке, не понимаю п
Написать процедуру поиска в списке, расположенном на рабочем листе с именем «Цены» активной рабочей...

Подскажите почему не выполняется код
Открываю SQL Server 2005 создаю новый запрос ввожу данный код и выполняю. Выскакивает две ошибки,...

Почему код выполняется синхронно?
Всем привет! Это мое первое сообщение на форме, первая попытка подружиться с .net и соответственно...

OnKeyPress - Почему код выполняется с задержкой?
Ситуация такая, имеется вот такая конструкция - label1.Caption:=Edit1.Text; Все вводимое в Edit...

Почему этот код неправильно выполняется?
Почему так? n = int(input()) def main(): for i in range(1,n*n): if i % 7 ==...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.