Achtergrond van de vraag: In de programmeertaal C zijn pointers variabelen die adressen van andere objecten opslaan. Er ontstond een probleem: hoe vergelijk je zulke waarden, aangezien het geheugen op de meest onvoorspelbare manieren kan zijn verdeeld. De taal staat de operatie van vergelijking tussen pointers toe, maar legt een aantal beperkingen op om ervoor te zorgen dat het gedrag voorspelbaar blijft.
Probleem: Pointers kunnen alleen correct met elkaar vergeleken worden als ze naar elementen van dezelfde array wijzen of naar hetzelfde object. Het vergelijken van pointers die naar niet-gerelateerde objecten wijzen (verschillende variabelen of toegewezen geheugengebieden die geen deel uitmaken van dezelfde array) resulteert in ongedefinieerd gedrag.
Oplossing: Het is nodig om te vermijden om pointers te vergelijken tussen niet-gerelateerde geheugengebieden, ze alleen te gebruiken binnen dezelfde array/rij/buffer, en vergelijking met NULL is veilig.
Voorbeeldcode:
#include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int *p1 = &arr[1]; int *p2 = &arr[3]; if (p1 < p2) { printf("p1 wijst naar een eerder element in de array dan p2\n"); } }
Belangrijke kenmerken:
1. Mag je pointers vergelijken die zijn verkregen via malloc en die naar verschillende geheugendelen verwijzen?
Nee, dergelijke pointers mogen niet vergeleken worden - het gedrag is niet gedefinieerd volgens de standaard. Alleen pointers naar dezelfde toegewezen geheugensegment of naar NULL mogen vergeleken worden.
2. Wat retourneert de vergelijking van pointers van type int en double, als ze naar verschillende variabelen wijzen, maar dezelfde numerieke waarde hebben?**
Vergelijking is alleen mogelijk als beide pointers naar hetzelfde object wijzen en naar hetzelfde type zijn gecast. Als dit niet het geval is, is het resultaat ongedefinieerd - de adreswaarden kunnen gelijk zijn, maar de standaard garandeert dit gedrag niet.
3. Is het correct om een pointer naar het eerste element van een array te vergelijken met een pointer naar het einde ervan (bijvoorbeeld arr en arr + N)?
Ja, dit is correct. arr + N wijst naar een denkbeeldig element dat volgt op het laatste, en de compiler garandeert dat arr <= arr + N.
Een medewerker besloot een functie te implementeren om adressen te vergelijken om te bepalen "is het eerder aangemaakt" tussen twee structuren, toegewezen uit verschillende geheugensegmenten.
Voordelen:
Nadelen:
Na een review werd er een controle geïmplementeerd om te verifiëren dat de pointers tot hetzelfde geheugensegment behoren door alle structuren in een gemeenschappelijke buffer toe te wijzen en vervolgens binnen de toegestane grenzen te vergelijken.
Voordelen:
Nadelen: