Привет. Я уверен, что это должен быть общий вопрос, но я не могу найти ответ, когда я его ищу. Мой вопрос в основном касается двух указателей. Я хочу сравнить их адреса и определить, больше ли один из них. Я бы ожидал, что во время сравнения все адреса будут неподписанными. Это правда, и отличается ли это от C89, C99 и С++? Когда я компилирую с gcc, сравнение не имеет знака.
Если у меня есть два указателя, которые я сравниваю следующим образом:
char *a = (char *) 0x80000000; //-2147483648 or 2147483648 ?
char *b = (char *) 0x1;
Тогда a
больше. Гарантируется ли это стандартом?
Изменить, чтобы обновить то, что я пытаюсь сделать. У меня есть ситуация, когда я хотел бы определить, что если есть арифметическая ошибка, она не заставит указателя выйти за пределы. Прямо сейчас у меня есть начальный адрес массива и конечный адрес. И если есть ошибка, и вычисление указателя неверно, и за пределами допустимых адресов памяти для массива, я хотел бы убедиться, что нарушение доступа не происходит. Я считаю, что могу предотвратить это, сравнивая подозрительный указатель, который был возвращен другой функцией, и определяя, находится ли он в допустимом диапазоне массива. Вопрос об отрицательных и позитивных адресах связан с тем, могу ли я проводить сравнения, как обсуждалось выше в моем первоначальном вопросе.
Я ценю ответы до сих пор. Основываясь на моем редактировании, вы скажете, что то, что я делаю, - это поведение undefined в gcc и msvc? Это программа, которая будет работать только в Microsoft Windows.
Здесь приведен более упрощенный пример:
char letters[26];
char *do_not_read = &letters[26];
char *suspect = somefunction_i_dont_control(letters,26);
if( (suspect >= letters) && (suspect < do_not_read) )
printf("%c", suspect);
Другое редактирование, после прочтения ответа AndreyT, кажется правильным. Поэтому я сделаю что-то вроде этого:
char letters[26];
uintptr_t begin = letters;
uintptr_t toofar = begin + sizeof(letters);
char *suspect = somefunction_i_dont_control(letters,26);
if( ((uintptr_t)suspect >= begin) && ((uintptr_t)suspect < toofar ) )
printf("%c", suspect);
Спасибо всем!