2015-09-25 3 views
0

Я знаю, как сделать арифметику указателя с помощью массивов, но как я могу сделать арифметику указателей без них?Как выполнить арифметическую операцию по указателю на пустоту

Для моего текущего назначения у меня есть указатель на пустое место на адрес памяти. У меня есть size_t, который хранит размер в мегабайтах.

Я пытаюсь добавить половину мегабайта в указатель, чтобы найти адрес памяти x/2 мегабайт от указателя.

Так

void *ptr = malloc(size_t x)  
void *ptr2 = ptr+x/2; 

но компилятор говорит, что эти типы данных несовместимы. для чего нужен правильный синтаксис?

+0

'malloc (size_t x)' это не будет компилироваться. –

+0

извините, это больше скелетного кода. исходный указатель предоставляется мне и связан с началом области памяти, заданной malloc. Я хочу пройти эту память и сделать указатель на полпути через нее, или половину размера x. –

+0

компилятор дает мне ошибку во время второй операции - когда я пытаюсь добавить размер в мегабайтах к указателю пустоты. –

ответ

4

Вы не должны делать арифметику указателя на указателях пустоты. Если вы просто хотите увеличить указатель на количество байтов, вам нужно указать указатель на char *, а затем применить к нему арифметику указателей.

Примечание: Арифметическая операция на указателе void не является стандартом C, хотя некоторый компилятор может поддерживать это как расширение компилятора, но вам лучше не полагаться на это.

Детальное описание на этом же месте можно найти here.


Если это возможно, вы можете избежать проблем пустого указателя арифметики путем изменения типа данных ptr в char * (или simmilar). Указатель void, возвращаемый malloc(), автоматически присваивается типу данных ptr при назначении, а затем вы можете выполнить арифметическую операцию на ptr, имея в виду размер типа данных.

+0

Он должен, вероятно, пойти на другой подход. – Michi

+0

@JohnBollinger Yep, опечатка. :) –

+0

@ Мичи, пожалуйста, уточните немного больше? –