* Внимание с адреси към локални променливи
Публикувано на 28 ноември 2009 от Филип Петров. Записано в C/C++.
Съвсем наскоро ми се наложи да оправям много странен бъг в една програма, която ми я прати студент. Накратко – функция на С връщаше адрес към локална променлива. Програмата си работеше перфектно, но… до един момент, в който се записваше нещо ново в стека. Естествено кодът беше достатъчно объркан и зле документиран, а и аз се бях „облъчил“ с Java и ми беше трудно да превключа на „вълна C“. Радвам се обаче, че успях да открия грешката. Съставих и един примерен модел на това, от което трябва да се пазите много, когато работите с указатели:
#include "stdafx.h"
#include "stdio.h"
int* getval()
{
// създаваме локална променлива
int x=1;
// Връщаме адреса й - това е проблема!
// Такава грешка може да се направи например
// когато правим някакви временни изчисления.
return &x;
}
// Функция, която "не прави нищо"
void dummyFunc()
{
int x=2;
}
int main()
{
int *p;
p = getval();
printf ("*p = %d\n", *p);
dummyFunc();
printf ("*p = %d\n", *p);
return 0;
}
Изпълнението на горният код „изненадващо“ е:
*p = 1 *p = 2
Интересното е, че в горния пример компилаторът много добре се ориентира и връща warning:
warning C4172: returning address of local variable or temporary
При въпросната задача студентът много добре беше замаскирал действието и компилаторът не връщаше никакви предупреждения. Отне ми цяла вечер :)
Trackback URI | RSS за коментарите
Пусни коментар
Страници
Категории
- C/C++ (45)
- DB (36)
- Dogs (49)
- Food (7)
- History (8)
- Java (33)
- Lada (41)
- Math (104)
- Metodos (23)
- NetSec (36)
- Other (76)
- Politics (32)
- Probability (13)
- VC++.Net (1)
- XHTML/JS (25)
Нови
- Един виц за капитализма
- Как да получиш целувка?
- Лека разходка на Витоша
- Роко и Берра на училище
- Газова бутилка под багажника на Лада Нива