LINUX.ORG.RU

Насколько безопасно использовать адрес как значение?

 


1

1
    int *x;
    *x=0;
    for(int i=0;i<10;i++){
        *x+=10;
    }

Вместо числа int x использовать адрес…

Просто постоянно вижу что так делают в ААА корпоративном софте (опенсурс), и сам уже начал так делать, очевидно что значение x не использую в таком случае, но насколько имеет смысл так делать через *x?



Последнее исправление: Zhbert (всего исправлений: 4)

тут у тебя сегфолт будет.

адрес должен быть существующей переменной.

прежде чем пользоваться адресом чего-то, адрес этого чего-то надо присвоить в этот указатель

типа

int int_var;

int *ptr = &int_var;//указателю на int присваиваешь адрес переменной int_var;
alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)

Нет, так неправильно делать, тут очевидная ошибка.

mxfm ★★
()

указатели - одна из самых мощных сущностей си, если кто-то начинает бояться их использовать, то: боги, куда катится этот паршивый мирок с его паршивыми программистами? ради всех святых, пишите на питоне

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

да я затупил, у меня корректно все(дефолтная передача ссылки) чтото я нафантазировал (переписал на С походу за полсдение дни, структуры и типы перепутались)

#include  <stdio.h>

void func(int *idx){
    for(int i=0;i<10;i++){
        *idx+=10;
    }
}

int main(void)
{
    int idx=0;
    func(&idx);
    printf("%d\n",idx);
    return 0;
}

мозг выключился когда писал пост сори

svv20624
() автор топика

Конкретно для int это имеет смысл делать только если нужно вернуть больше одного результата или сохранить этот указатель ещё где-то, т.к. на большинстве современных платформ размер int будет меньше или равен размеру указателя.

использовать адрес как значение

Учись свои мысли излагать понятно. В данном случае по заголовку ответ «только если знаешь, что делаешь», а по-факту, речь идёт про использование указателей на переменные.

pon4ik ★★★★★
()

Ну как сказать… от контекста зависит. MISRA например сильно ограничивает. А так можно использовать и вместо int, и вместо float, и вместо функции.

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

указатели - одна из самых мощных сущностей си

Ну да, едва ли в убогом C найдётся сущность мощнее убогих указателей.

если кто-то начинает бояться их использовать

Но это лучшее что с ними можно сделать из-за слабой выразительности, неудобства и небезопасности.

slovazap ★★★★★
()

дел я дурак

Не надо так делать. Это моветон. Восстанови вопрос из истории правок.

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

не всегда этого достаточно, я уже высказался по поводу страха перед указателями, возможно, они устарели, а возможно, программист обмельчал

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

Но это лучшее что с ними можно сделать из-за слабой выразительности, неудобства и небезопасности.

О, а вот и питонщики подтянулись! =)

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

указатели нужны в случаях

  • вы пишете функции вида change_variable( variable ), то есть функция меняет внешний обьект - variable, тогда в функцию подставляется адрес переменной.

  • вы передаете в функцию «большой обьект». - лучше передать его адрес, чем копировать весь обьект, как параметр. это т.н. передача параметра по адресу.

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

  • вам нужны переменные типа функция. это тоже указатель.

  • вы размещаете обьекты на куче или каким-то нестандартным образом.

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

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

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

те питон хорош лишь тем, что избавляет тебчя от всего этого байто*бства

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

самая большая проблема си, это работа со строками, надо очень много сил тратить на отладку и проверку алгоритма на разных входных данных, в остальном, по моему, libefence очень помогает

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

да, это так, у ТСА именно первый случай был вроде

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

change_variable( variable )

можно так

var = change_var(var)

но со структурами, как вы сказали, лучше указатели

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

все ж и так работает логично: указатель - это просто число, которое указывает на ячейку памяти. sizeof возвращает тебе размер этого числа (8 байт)

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

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

списочные структуры

списочные

Шок:

['root', [['child1', None], ['child2', [['child2_1', None], ['child2_2', None], ['child2_3', None]]]]]
tz4678 ★★
()
Ответ на: комментарий от tz4678

Уверен?

https://godbolt.org/z/b55rf6jKW

static_assert(sizeof(int) == sizeof(int*));
<source>:2:27: error: static assertion failed
    2 | static_assert(sizeof(int) == sizeof(int*));
      |               ~~~~~~~~~~~~^~~~~~~~~~~~~~~
Compiler returned: 1
Siborgium ★★★★★
()
Последнее исправление: Siborgium (всего исправлений: 1)
Ответ на: комментарий от tz4678
main (n, p)
{
    printf ("%s\n", *(int *)p);
    return 0;
}

не печатает

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

Шок:

не совсем понял что за тря..удь там вами написана, но списочная структура, это структуры данных, состоящие в простейших случаях, из элементов вида:

struct Element {
  Element *next;
  type value;
}
alysnix ★★★
()

адрес это и есть значение / число. но в int оно скорее всего не влезет. в остальном зависит от контекста.

waker ★★★★★
()

Удалять содержание топика - плохой тон.

Если вопрос больше не интересен - пометь тему как решённую и/или отпишись в сам тред с результатом.

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

Начнем с того,что не int64, а intptr.

Закончим тем, что советую читать сообщения, на которые отвечаешь.

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

указатели - одна из самых мощных сущностей си

которая в 2021 году не нужна в 95% случаев даже в системном софте

если кто-то начинает бояться их использовать

вы путаете боязнь с нежеланием тратить своё время/ментальный ресурс на то, на что его можно не тратить

боги, куда катится этот паршивый мирок с его паршивыми программистами?

не, я конечно согласен, но он туда катится уже давно, и не в последнюю очередь благодаря сям

вот вам очень краткая генеалогия сортов

C->C++->Java-C# ....
\->PHP    \->JS

пишите на питоне

спасибо, но нет, питон также писан дидами с сишным бэкграундом, так что несите обратно ваши мутабельные алголы туда, откуда принесли

anonymous
()
Ответ на: комментарий от svv20624

мозг выключился когда писал пост сори

после постоянного байтодроча это нормально, не извиняйтесь

anonymous
()
Ответ на: комментарий от alysnix

вы пишете функции вида change_variable( variable ), то есть функция меняет внешний обьект - variable, тогда в функцию подставляется адрес переменной.

тут есть проблема, указатель в Си (хотя, почему только указатель) - ничем не типизированная и абсолютно не контролируемая фигня, Б - безопасность

вы передаете в функцию «большой обьект». - лучше передать его адрес, чем копировать весь обьект, как параметр. это т.н. передача параметра по адресу.

кто мешал заимплементировать механизм дефолтной иммутабельной передачи параметра по ссылке?

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

ору чаечкой

вам нужны переменные типа функция. это тоже указатель.

тяжко вам без ФВП дядь?

вы размещаете обьекты на куче или каким-то нестандартным образом.

на куче чего? Ах, ну да…

anonymous
()
Ответ на: комментарий от tz4678

все ж и так работает логично: указатель - это просто число, которое указывает на ячейку памяти.

нифига не логично, указатель - это адрес, он может быть числом любой размерности, он может быть строкой вида «нахуторбабочек ловить», лишь бы уникальной и проиндексированной, всё зависит от архитектуры, про которую в большинстве случаев думать нафиг не надо. А в Си, за каким-то бесом, это всё понамешано, так что все кишки наружу. Это как всех, кто хочет ухаживать за девушкой, заставлять отучиться 8 лет на хирургии.

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

тут есть проблема, указатель в Си (хотя, почему только указатель) - ничем не типизированная и абсолютно не контролируемая фигня, Б - безопасность

ты про си почитал бы че-нить для начала…

ору чаечкой

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

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

которая в 2021 году не нужна в 95%

как так могло произойти, что 30 - 20 - 10 лет назад была нужна, а теперь вдруг не нужна, принципиально изменилась система команд процессоров? или системное по научились писать на яве с сишарпом?

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

30 - 20 - 10 лет назад была нужна

когда-то и перфокарты были нужны

или системное по научились писать на яве с сишарпом?

«системное» - это вон те 5%, gnu coreutils, например, в них не входит.

anonymous
()
Ответ на: комментарий от alysnix

ты про си почитал бы че-нить для начала…

почитал, sizeof(pointer) скажи теперь :)

а нарисуй список без указателя

(cons ’жопа nil)

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

принципиально изменилась система команд процессоров?

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

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

(cons ’жопа nil)

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

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

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

я в первом сообщении написал про целесообразность интернатуры меда для банального общения с людьми

anonymous
()
Ответ на: комментарий от IvanR

ядро

я вроде озвучил тезис про 95% (условно), имхо этого достаточно, новые востребованные по делу ядра появляются раз в десятки лет

они даже в хваленом расте есть

есть большая разница между тем, что ты МОЖЕШЬ байтодрочить, если припёрло, и тем, что ты ДОЛЖЕН байтодрочить всегда

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

так что там с sizeof?

а что случилось с sizeof? это вопрос непринципиальный.

размер указателя должен быть не меньше размера адреса, это более чем очевидно.

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

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

новые востребованные по делу ядра появляются раз в десятки лет

старое еще никто не отменял

ДОЛЖЕН

я никому ничего не должен, мне, по сути, плевать на результат, я люблю свободу, которую дает си

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

ДОЛЖЕН

вообще, я художник, я так вижу, лучше сидеть без гроша в кармане, чем прогнуться под этот ваш БЕЗОПАСННЫЙ код

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

старое еще никто не отменял

легаси нельзя вылечить, можно просто делать так, чтобы было не сильно больно

я никому ничего не должен, мне, по сути, плевать на результат,

господин судья, прошу вот это занести в протокол

anonymous
()
Ответ на: комментарий от IvanR

вообще, я художник, я так вижу, лучше сидеть без гроша в кармане, чем прогнуться под этот ваш БЕЗОПАСННЫЙ код

и это тоже занесите

И если это не сарказм, то спасибо за просранную индустрию. Уже могли бы на Марс летать, а вместо этого перекладываем байтики вручную, дебажим сегфолты, UB, войд пойнтеры и прочую дрисню

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