2013-01-24 17 views
19

C++ średnia [s 5,7] mówi:Czy wskaźnik "jeden od końca-końca" typu bez tablicy jest poprawną koncepcją w C++?

Jeśli zarówno operand wskaźnik i punkt wynik do elementów tego samego obiektu tablicy lub jeden obok ostatni element obiektu tablicy, ocena nie powinna wytworzyć przepełnienie; w przeciwnym razie zachowanie jest nieokreślone.

Czy mam rację, zakładając, że wskaźniki typu "przeszłość końca" innych typów niż tablice są niezdefiniowane?

Na przykład:

int a = 0; 
vector<int> v(&a, (&a)+1); 

Powyższy fragment kompiluje i działa dobrze (z g ++), ale czy to ważne?

+0

Chciałbym wypowiedzieć się na temat tego, czy 'wskaźniki jednego-końca-końca-typu innych niż tablice są niezdefiniowane?'. ** Wskaźniki ** są zawsze zdefiniowane, ponieważ są po prostu liczbami, adresami. Wartość ** ** dla tego wskaźnika jest jednak niezdefiniowana. Nie wolno ci wyłączać tych wskazówek. Ale konstruktor 'vector' nie usuwa ich, więc jest w porządku. – NIA

+0

Prawda, ale przestrzeń adresowa nie jest nieskończona. Tak więc istnieje wskaźnik do ostatniego elementu w przestrzeni adresowej. Zwiększanie tego wskaźnika nie ma sensu. –

+7

Wskaźniki nie są po prostu liczbami. Standard C++ wyraźnie pokazuje, że nie można używać arbitralnego dodawania i odejmowania za pomocą wskaźników. W szczególności praktyka używania wskaźnika do jednego przed tablicą w celu dostosowania do algorytmów opartych na 1 powoduje niezdefiniowane zachowanie. AFAIK są lub były architekturami komputerowymi, gdzie ładowanie wartości, która nie wskazuje prawidłowej pamięci do rejestru wskaźnika, może spowodować pułapkę. – JoergB

Odpowiedz

25

Nie, jest to zgodne z prawem. 5.7 (4) - jeden akapit przed twoim cytatem - mówi: "Dla celów tych operatorów, wskaźnik do obiektu niezarażonego zachowuje się tak samo jak wskaźnik do pierwszego elementu tablicy długości z typem obiektu jako jego typ elementu. "

+0

masz na myśli "ważny", a nie "legalny", jak zakładam. w przeciwnym razie wielu programistów może pójść do więzienia. –

+0

Tak. "legal" = "valid, zgodnie ze specyfikacją języka C++" – JoergB

+0

JoergB: Dzięki! Całkowicie opuściłem to zdanie. –