2012-06-13 5 views
1
#include<stdio.h> 
#include<stdlib.h> 
char* re() 
{ 
    char *p = "hello"; 
    return p;  
} 
int main() 
{ 
    char* tem = re(); 
    printf("%s", tem); 
    return 0; 
} 

Мой компилятор - Dev-C++. Я думаю, что когда функция «re» завершается, указатель «p» будет удален, и пространство стека, которое указывает «p», также будет удалено. Таким образом, указатель «tem» не может посещать пространство стека, на которое указывает «p». На мой взгляд, в этом коде появятся некоторые ошибки. но почему нет?c язык и некоторые сомнения в указателе

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

+2

Указатель p выйдет за рамки. Но его * значение * (то, на что оно указывает) будет возвращено вызывающему (основному). И это (значение) указывает на строковый литерал, который все еще существует после возврата re(). – wildplasser

ответ

5

p не указывает на пространство стека. Он указывает на строковый литерал "hello". Поскольку строковые литералы гарантированно действуют во всей программе, ваша программа в порядке.

(я не знаю, о Dev-C++, но в большинстве компиляторов, строковые литералы выделяются в некоторой памяти только для чтения при загрузке программы, и остается там до конца этого)

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

+0

Just FYI: Dev-C++ - это просто среда, которая использует MinGW, поэтому под капотом находится только gcc. –

0

Строка «hello» не содержит стек alloc'ed (но указатель char *p).
Он находится в «сегменте данных», потому что это постоянное значение (постоянное запоминающее устройство).
От C Часто задаваемые вопросы: http://c-faq.com/decl/strlitinit.html

Смежные вопросы