LINUX.ORG.RU

Какая-то дичь в Си

 , ,


0

1
#include <stdio.h>
void log(int x)
{
  int *ptr = x;
  *ptr += 17;
  printf("%d\n", *ptr);
}

int main(void)
{
  int n = 20;
  log(&n);
  return 0;
}


Этот код падает с сегфолтом
Почему нельзя так делать? Или может я неправильно делаю?

★★

Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от anonymous

Кастую царя в тред. :-)

Как-то не видно его давно. Царь сам себя не внесёт.

melkor217 ★★★★★
()
Ответ на: комментарий от i-rinat

Рахмат, Ренат!

Сделал мой день!

:-D

P.S. Неделя школотредов на ЛОРе объявляется открытой.

Twissel ★★★★★
()

Рекомендую тебе сначала почитать от корки до корки «Ассемблер» Юрова В.И.,

чтоб не спотыкаться на ровном месте и знать как устроен ПК изнутри.

Twissel ★★★★★
()
Ответ на: комментарий от pacify

транзистор - это уже детали физической реализации :)

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

Harald ★★★★★
()
Ответ на: комментарий от Harald

туда-сюда снуют

Туда понятно, а обратно как они попадут? )

curufinwe ★★★★★
()
Ответ на: комментарий от i-rinat

Тогда грусть-печаль.

Да, ты прав. Придётся винца бахнуть сегодня.

UVV ★★★★★
()

Этот код падает с сегфолтом
Почему нельзя так делать? Или может я неправильно делаю?

такие вопросы лучше задавать на http://www.cyberforum.ru/cpp-beginners/

AlexVR ★★★★★
()
Ответ на: комментарий от qulinxao

Я уже понял, что так нельзя, спасибо
Захотелось просто некой автоматики
Просто надеялся, что в Си есть какой-то аналог typeof из JS, но увы

mystery ★★
() автор топика
Ответ на: комментарий от mystery

Ну вообще есть варианты.


#include <stdio.h>

#define log(X) _Generic((X), \
        int : log_int, \
        int *: log_int_ptr)((X))

void log_int(int x) {
    printf("int: %d\n", x);
}
void log_int_ptr(int *x) {
    *x += 17;
    printf("int ptr: %d\n", *x);
}

int main(void)
{
      int n = 20;
      log(n);
      log(&n);
      return 0;
}

deadskif
()
Ответ на: комментарий от i-rinat

-fno-strict-aliasing

Единственный вменяемый комментарий за весь тред.

Manhunt ★★★★★
()

Никто не написал очевидного.
Урок отладки n.1:

igor:...projects/test/ptr% cat ptr.c
#include <stdio.h>
void log(int x, unsigned long long y)
{
  printf("log: x = %llx\n", x);
  printf("log: y = %llx\n", y);
  int *ptr = x;
  *ptr += 17;
  printf("%d\n", *ptr);
}

int main(void)
{
  int n = 20;
  printf("ptr to n = %p\n", &n);
  log(&n, &n);
  return 0;
}

igor:...projects/test/ptr% ./a.out  
ptr to n = 0x7ffe4cc0c244
log: x = 4cc0c244
log: y = 7ffe4cc0c244
zsh: segmentation fault (core dumped)  ./a.out
Так что, как тебе правильно выше скзаали, ты пытаешься впихнуть невпихуемое :)

invy ★★★★★
()
Ответ на: комментарий от mystery

Не увы, передавай унион с тегом, по значению тега забирай нужный член.

enum vtype { VT_INT, VT_INTP };
struct value { enum vtype t; union { int i, *ip; } v; };

#define mkint(i_) ((struct value){VT_INT,{.i=(i_)}})
#define mkintp(i) ((struct value){VT_INTP,{.ip=&(i)}})

void log(struct value v) { switch (v.t) {
  case VT_INT: /* v.v.i */; break;
  case VT_INTP: /* v.v.ip */; break;
} }

int i = 20;
log(mkint(i));
log(mkintp(i));

Но зачем? Какая еще автоматика? Для чего это?

arturpub ★★
()
Ответ на: комментарий от arturpub

Я уже понял свою проблему, пытаюсь сделать из Си динамичный язык, выше уже разъяснили, что это бессмысленно
Хотел, что бы функция принимала как указатели, так и просто числа

mystery ★★
() автор топика
Ответ на: комментарий от curufinwe

Тут понять надо, а не учить.

Так учить, а не зубрить

quest ★★★★
()
31 мая 2017 г.
Ответ на: комментарий от mystery

Не бессмысленно а широко используется, variadic functions)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.