Предупреждение о приведении указателя - PullRequest
0 голосов
/ 27 апреля 2011

В программе на C, которую я пишу, есть функция void *dereference_physical_page(unsigned int ppn);

который я звоню с unsigned int* pde = ((unsigned int*)dereference_physical_page(context >> 12))[vaddr >> 22];

К сожалению, компилятор выдает мне это предупреждение, независимо от того, что я пытаюсь, и программа не должна иметь предупреждений для компиляции в соответствии со спецификациями для этого назначения.

edit (я думал, что написал это): предупреждение «инициализация делает указатель из целого числа без приведения». Если я удаляю звездочку без знака int * pde, это работает; Тем не менее, я хочу сделать указатель pde.

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

Есть какие-нибудь подсказки?

Ответы [ 4 ]

2 голосов
/ 27 апреля 2011

Если вам нужен указатель на элемент, вам нужно будет использовать +(vaddr >> 22) вместо [vaddr >> 22].Пожалуйста, имейте в виду, что арифметика указателей здесь учитывается в размерах unsigned, а не в байтах.

Но, честно говоря, вы даже не знаете, как работают указатели в C. Вы определенно не должны 'не используйте такие хаки, пока не освоите эти вещи лучше.

2 голосов
/ 27 апреля 2011

Вы разыменовываете указатель с помощью [vaddr >> 22], что означает, что выражение имеет тип unsigned int. Затем вы присваиваете это unsigned int *. Вот откуда исходит ошибка.

0 голосов
/ 27 апреля 2011

((unsigned int*)dereference_physical_page(context >> 12))[vaddr >> 22];
Вы используете приведенный указатель типа, возвращаемый dereference_physical_page, и обращаетесь к элементу массива, используя этот возвращенный указатель ...

0 голосов
/ 27 апреля 2011

Вы не сказали, что такое «это предупреждение», но вы индексируете unsigned int*, который дает unsigned int, а затем пытаетесь присвоить его unsigned int*, который по праву выдаст вам предупреждение,Если вам действительно нужно, чтобы результат был указателем, тогда приведите значение от dereference_physical_page до unsigned int** (два '* вместо одного).Это предполагает, что результатом dereference_physical_page(context >> 12) является адрес массива unsigned int* s, а вы хотите (vaddr >> 22) th.

...