Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> возвращаем указатель и адрес, большая разница 
:(
    Опции темы
GQU
Дата 15.8.2014, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Почему в одном случае warning, в другом норм??
Код

#include <stdio.h>
#include <stdlib.h>

//tmp() меняет местами
int* tmp(int a, int b){
    int* p;
    int tmp;
    tmp=a;
    a=b;
    b=tmp;
    p=&a;
    return p;//специально возвращаю адрес
}
void main(){
    int i,j;
    i=5;j=10;
    printf("i = %d",*tmp(i,j));
    printf("\n");
    system("pause");
}

и
Код

#include <stdio.h>
#include <stdlib.h>

//tmp() меняет местами
int* tmp(int a, int b){
    int* p;
    int tmp;
    tmp=a;
    a=b;
    b=tmp;
    return &a;//специально возвращаю адрес
}
void main(){
    int i,j;
    i=5;j=10;
    printf("i = %d",*tmp(i,j));
    printf("\n");
    system("pause");
}


Это сообщение отредактировал(а) GQU - 15.8.2014, 13:53
PM MAIL   Вверх
SVN74
Дата 15.8.2014, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Немного подправил...
Код

#include <stdio.h>
#include <stdlib.h>
//tmp() меняет местами
int* tmp(int &a, int &b)
{
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
    return &a;//специально возвращаю адрес
}
void main(){
    int i,j;
    i=5;
    j=10;
    printf("i = %d \n",*tmp(i,j));
    printf("i = %d, j = %d \n", i, j);
    system("pause");
}


PM MAIL WWW   Вверх
tzirechnoy
Дата 16.8.2014, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Видимо, компилятор в одном случае догадывается, что ты делаешь херню, а в другом -- ты успешно её замаскировал и он не догадывается.

PS Читать warning не пробовал? Для развлечения там, например.
PM MAIL   Вверх
baldina
Дата 16.8.2014, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



GQU, вроде бы совсем недавно обсуждали: адрес локальной переменной возвращать нельзя.

Добавлено через 4 минуты и 10 секунд
SVN74, зачем запостил то что не компилируецца ((((
PM MAIL   Вверх
tzirechnoy
Дата 16.8.2014, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



baldina, не то чтобы возвращать нельзя (вон -- вернул жэ), просто обращение к нему не будет обращаться к этой локальной переменной smile.
PM MAIL   Вверх
GQU
Дата 16.8.2014, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Цитата

GQU, вроде бы совсем недавно обсуждали: адрес локальной переменной возвращать нельзя.

я в курсе,что нельзя, поэтому в комментах и написал, что специально возвращаю адрес, просто мне интересно, почему в одном случае warning, в другом норм(хотя в обоих случаях возвращаем адрес), я обращаю на это внимание, потому что, компиляторы делают тоже не дураки, может там какая нить фишка, какой нить хитрый момент

Это сообщение отредактировал(а) GQU - 16.8.2014, 21:14
PM MAIL   Вверх
SVN74
Дата 17.8.2014, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Цитата(baldina @  16.8.2014,  13:21 Найти цитируемый пост)
SVN74, зачем запостил то что не компилируецца ((((

Конечно все зависит от придирчивости компилятора,  данный пример C++ Builder XE6 хавает без "варнингов"  smile   
PM MAIL WWW   Вверх
baldina
Дата 17.8.2014, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(SVN74 @  17.8.2014,  12:32 Найти цитируемый пост)
данный пример C++ Builder XE6 хавает без "варнингов"

в режиме "С"?  smile

Добавлено через 6 минут и 1 секунду
GQU, хитрых моментов нет, т.к. не запрещено. прост в каких-то случаях компилятор может сообразить, что указатель - адрес локальной переменной, и предупредить, а в каких то нет.

вообще приведенный пример, мягко говоря странный. если нужно обменять два значения, передавать нужно по указателю, т.к. переменные переданные по значению модифицировать никак нельзя. 
такая функция видимо не должна вообще иметь возвращаемого значения.
ну уж если сильно хочется именно так, то

Код

int swap (int *a, int *b) {
  int tmp = *a;
  *a = *b;
  *b = tmp;
  return *a;
}

или
Код

int* swap (int *a, int *b) {
  int tmp = *a;
  *a = *b;
  *b = tmp;
  return a;
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.