Здравейте! Вероятно използвате блокиращ рекламите софтуер. В това няма нищо нередно, много хора го правят.

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

  Ако не знаете как, кликнете тук

ANSI C: Това минава ли за "dangling pointer"?

feed Всякакви програми и проблемите свързани с тях.
Нова тема Отговори
Потребителски аватар
Жopkaта
Почетен член
Почетен член
Мнения: 1845
Регистриран: чет сеп 10, 2015 21:39
Репутация: 17186
пол: Мъж

ANSI C: Това минава ли за "dangling pointer"?

Мнение от Жopkaта »

Не се смейте, в процес на самоубочение съм.

Тествах следния код на няколко компилатора и не ми се струва да произвежда "undefined behaviour", въпреки, че проблема с непредвидимото поведение е, че може да виждаш нещо, което изглежда според планираното, но всъщност програмата ти бълва някакви случайни работи.

Та понеже assembly езиците, както и неща като "compiler explorer" са ми все още тъмна индия (все едно гледам древноегипетски йероглифи, макар че от asm чат-пат разбирам на този или на онзи ред какво се случва).

И така, след тази увертюра - ето малкия пример, който написах:

Код: Избери всички

#include <stdio.h>

void returnAddress(short **acceptPtrAddress);

int main()
{
    short *ptr;

    returnAddress(&ptr);
    
    printf("ptr points to address:\t%p\nDereferenced ptr displays value of: %d\n", ptr, *ptr);

    return 0;
}

void returnAddress(short **acceptPtrAddress)
{
    short a;
    puts("Enter value for a: ");
    scanf(" %hi", &a);
    
    printf("Address of var a is:\t%p\n", &a);

    *acceptPtrAddress = &a;
    
    puts("\nNow terminating returnAddress function.\nAll local variables being deleted.\nControl reverts back to main...\n");
}
Въпросът ми към този пример е: указателят ptr, който е във функцията "main()", явява ли се "dangling"?
Прочетено: 82 пъти
Потребителски аватар
cprog
Ветеран
Ветеран
Мнения: 1426
Регистриран: нед юли 19, 2015 08:19
Репутация: 12986
пол: Мъж

Re: ANSI C: Това минава ли за "dangling pointer"?

Мнение от cprog »

Жopkaта написа:
пет яну 06, 2023 21:39
Не се смейте, в процес на самоубочение съм.

Тествах следния код на няколко компилатора и не ми се струва да произвежда "undefined behaviour", въпреки, че проблема с непредвидимото поведение е, че може да виждаш нещо, което изглежда според планираното, но всъщност програмата ти бълва някакви случайни работи.

Та понеже assembly езиците, както и неща като "compiler explorer" са ми все още тъмна индия (все едно гледам древноегипетски йероглифи, макар че от asm чат-пат разбирам на този или на онзи ред какво се случва).

И така, след тази увертюра - ето малкия пример, който написах:

Код: Избери всички

#include <stdio.h>

void returnAddress(short **acceptPtrAddress);

int main()
{
    short *ptr;

    returnAddress(&ptr);
    
    printf("ptr points to address:\t%p\nDereferenced ptr displays value of: %d\n", ptr, *ptr);

    return 0;
}

void returnAddress(short **acceptPtrAddress)
{
    short a;
    puts("Enter value for a: ");
    scanf(" %hi", &a);
    
    printf("Address of var a is:\t%p\n", &a);

    *acceptPtrAddress = &a;
    
    puts("\nNow terminating returnAddress function.\nAll local variables being deleted.\nControl reverts back to main...\n");
}
Въпросът ми към този пример е: указателят ptr, който е във функцията "main()", явява ли се "dangling"?
Да, защото не е инициализиран и не сочи наникъде. .
CPU~Dual core AMD Athlon 64 X2 5200+ (-MCP-) speed~2700 MHz (max) Kernel~4.15.0-33-generic x86_64 Up~1 day Mem~4869.6/7976.7MB HDD~2400.5GB(45.8% used) Procs~313 Client~Shell inxi~2.3.56
Потребителски аватар
Жopkaта
Почетен член
Почетен член
Мнения: 1845
Регистриран: чет сеп 10, 2015 21:39
Репутация: 17186
пол: Мъж

Re: ANSI C: Това минава ли за "dangling pointer"?

Мнение от Жopkaта »

Примерен изход:

Код: Избери всички

Enter value for a: 
12
Address of var a is:	0x7ffd3a5c8006

Now terminating returnAddress function.
All local variables being deleted.
Control reverts back to main...

ptr points to address:	0x7ffd3a5c8006
Dereferenced ptr displays value of: 12
Инициализиран е във функцията void returnAddress. Когато контрола на изпълнението се връща обратно в main() функцията, той вече е инициализиран със стойност адреса на променливата "а", която е локална за функцията "returnAddress()", чието изпълнение вече е приключило, следователно променливата е изтрита.

Там е проблема, че не се сещам как да провокирам примера, че да демонстрира дали поведението му е неопределено. Всичко изглежда работи както очаквам, но понякога това също може да е характерно за неопределеното поведение. От друга страна въпреки стабилните и очаквани резултати, указателят сочи към адрес, който е освободен от променливата, която го е заемала и това е условие и предпоставка за неопределено поведение, а също така и за самия указател да бъде счетен за "висящ".

Ако освободените адреси например се връщаха към ОС, тогава при опит да достъпя някакъв такъв адрес, би ми върнало segmentation fault и бих разбрал, че се опитвам да достъпя непозволен адрес.
Нова тема Отговори

  • Подобни теми
    Отговори
    Преглеждания
    Последно мнение

Върни се в “Софтуер”