Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 209
1

Соответствует ли это стандарту С?

04.09.2011, 07:40. Показов 895. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В Visual Studio и в CodeBlocks такой код компилируется с предупреждением.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
 
void f(int *p)
{
    *p = 0;
}
 
int main(int argc, char *argv[])
{
    const int i = 100;
    f(&i);
    printf("%d\n", i);
    getchar();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2011, 07:40
Ответы с готовыми решениями:

насколько это соответствует стандарту?
#include &lt;iostream&gt; class shit { private: int x; public: shit(){} shit(int p)...

Соответствует ли код стандарту?
Привет! Имеется следующий код (в очень урощенном виде) struct foo {}; int main() { struct...

какому стандарту С++ соответствует minGW
Здравствуйте! У меня возникла такая проблема: я сейчас изучаю С++ и компилирую программы с помощью...

Какова вероятность того, что устройство соответствует стандарту?
На заводе 95% аппаратуры выдерживает испытание. Из прошедших испытание устройств 97% соответствует...

6
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.09.2011, 07:47 2
А в gcc не компилируется. А если убрать const, то все нормально.
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.09.2011, 07:53 3
происходит неявное приведение типа указателя на const к типу указателя на не const
в операции присваивания это не допускается
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
04.09.2011, 08:48 4
На сколько я знаю const в C обладает несколько иным свойством, может дело в этом. С++ компилятор выдаст ошибку.
1
Формучанин
364 / 294 / 42
Регистрация: 02.11.2010
Сообщений: 1,242
04.09.2011, 16:18 5
чтобы убрать варнинги\ошибки надо сделать явное преобразование:
C
1
f((int*)&i);
Касаемо gcc\g++

1. Если переменная(константа i) расположена в стеке(в теле main() ):
В си, в функцию передастся адрес этой переменной, в printf() улетит значение взятое из стека.(вывод 0)
В си++ в функцию улетит адрес какой то стековой переменной, в printf() улетит 100.(вывод 100)
(в си++ константы работают иначе)

2. Если переменная объявлена как глобальная.
В обоих случаях ошибка сегментации.
Т.к. переменная расположена в памяти которая только для чтения, а функция делает попытку записи.

Однако, если:
C
1
volatile const int i = 100;
то программа станет вести себя одинаково как в си так и в си++.

Для наглядности можно скомпилировать эту программу через gcc и g++
меняя местами 8 и 11 строки
1
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
04.09.2011, 16:25 6
изменение значения переменной, первоначально объявленной как const приводит к undefined behaviour
при это законно снимать константность и изменять первоначально неконстантные переменные
C
1
2
3
4
5
6
7
8
9
10
11
void f(const int* a)
{
   *((int*)a) = 0;
}
 
int main()
{
   int a = 100;
   f(&a);
   return 0;
}
1
Заблокирован
04.09.2011, 18:41 7
Цитата Сообщение от stdcout Посмотреть сообщение
В Visual Studio и в CodeBlocks такой код компилируется с предупреждением.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
 
void f(int *p)
{
    *p = 0;
}
 
int main(int argc, char *argv[])
{
    const int i = 100;
    f(&i);
    printf("%d\n", i);
    getchar();
    return 0;
}
Нет, это не соответствует стандарту. В принципе, если бы переменная была бы объявлена не как автоматическая, а как статическая, то это могло бы привести к аварийному завершению программы, так как компилятор вправе поместить ее в памяти только для чтения.
0
04.09.2011, 18:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2011, 18:41
Помогаю со студенческими работами здесь

Каждой скобке соответствует какое-то число. Каждому числу соответствует какая-то буква. Напишите получившееся слово.
Каждой скобке соответствует какое-то число. Каждому числу соответствует какая-то буква. Напишите...

вводится число, вводится степень и надо узнать, соответствует ли это число данной степени
Series26. Даны целые числа K, N и набор из N вещественных чисел: A1, A2, …, AN. Вывести K-e...

Инициализация по стандарту C++11
Здравствуйте ув. форумчане. Читаю Прата С. Язык программирования С++ Лекции и упражнения 2012. В...

Привести к стандарту даты
Всем привет, возник такой вопрос, есть парсер, который данные даты записывает в таком формате - Jan...

Как писать код по стандарту
Извините, что создал тему скорей всего в неподходящей ветке. Но все же. Где-то читал (к сожалению...

Книга по стандарту с++ 11 для начинающих
Здравствуйте. В таможенной академии нам преподавали довольно древний язык с++. Правда, и...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru