Да, можно вернуть адрес во временный (то есть стек) объект и назначить его указателю. Однако компилятор может фактически отказаться от объекта (т. Е. Вызвать перезапись раздела в памяти) до конца текущей области. (TO CLARIFY: ДАННЫЕ СРЕДСТВА НЕ ДЕЛАЙТЕ ЭТО. КОГДА-ЛИБО.) См. Обсуждение в комментариях ниже о поведении, наблюдаемом в разных версиях GCC в разных операционных системах. (Я не знаю, указывает ли факт, что версия 4.5.3 дает предупреждение вместо ошибки, указывает, что это всегда будет «безопасным» в том смысле, что указатель будет действительным всюду в пределах текущей области, если вы скомпилируете с этой конкретной версии GCC, но я бы не стал на это рассчитывать)
Вот код, который я использовал (модифицированный согласно предложению Джонатана Леффлера).
#include <stdio.h>
class Class {
public:
int a;
int b;
Class(int va, int vb){a = va; b = vb;}
};
int main(){
Class *p = &Class(1, 2);
Class *q = &Class(3, 4);
printf("%p: %d,%d\n", (void *)p, p->a, p->b);
printf("%p: %d,%d\n", (void *)q, q->a, q->b);
}
при компиляции с помощью GCC 4.5.3 и запустить (на Windows 7 SP1), этот код напечатал:
0x28ac28: 1,2
0x28ac30: 3,4
При компиляции с помощью GCC 4.7.1 и запустить (на Mac OS X 10.8.3), он напечатал:
0x7fff51cd04c0: 0,0
0x7fff51cd04d0: 1372390648,32767
В любом случае, я не уверен, почему вы просто не просто объявляете переменную нормально и используете &v
везде, где вам нужно что-то «похожее на указатель» (например, в функциях, требующих указателя в качестве аргумента).
'Var * p = Var (" name ", 1);' не работает? – Patashu
Ум, вам действительно нужно получить доступ к объекту с помощью указателя? –
@Patashu Um .. no. – 0x499602D2