C пытается привести пустой указатель к другому типу - PullRequest
0 голосов
/ 24 февраля 2012

Хорошо, вот код:

//in another file

void **ptr; ptr = kmalloc(sizeof(void *) * 2);

  *(ptr+0) = tf; //type trapframe *
  *(ptr+1) = as; //type addrspace *

func(*ptr); 

И вот эта функция:

void func(void *ptr) {

struct trapframe *parentTF = ptr[0];
struct addrspace *newAS = ptr[1]; 
//now I wanna do stuff with parentTF and newAS

}

И ошибка, которую я получаю:

warning: dereferencing `void *' pointer

Спасибо залюбая помощь.

Ответы [ 6 ]

2 голосов
/ 24 февраля 2012

Если я правильно понимаю, что вы пытаетесь сделать, похоже, вам нужно изменить это:

void func(void *ptr) {

к этому:

void func(void **ptr) {

и это:

func(*ptr);

к этому:

func(ptr);

Обратите внимание, что *(ptr+0) и ptr[0] являются синонимами, как и *(ptr+1) и ptr[1].

1 голос
/ 24 февраля 2012

Сначала приведите массив указателей void к массиву нужного вам типа указателя. то есть вам нужно сделать такие изменения:

((trapframe **)ptr)[0] = tf; //type trapframe *

и еще один такой актерский состав:

struct trapframe *parentTF = ((trapfname**)ptr)[0];

1 голос
/ 24 февраля 2012

Вы объявляете ptr как void **, но используете его как void *.Они разные.

0 голосов
/ 24 февраля 2012

Ваш код кричит неправильно из-за несоответствий между двумя файлами. В одном из них вы получаете доступ к ptr [0] и ptr [1], в то время как в другом вы получаете доступ к * (ptr + 0) и * (ptr + 1) ... что здесь не является источником ошибки, потому что два синтаксисы означают одно и то же, но использование двух разных форм - это плохой стиль, плохое чтение и подверженность ошибкам. Но затем, в одном файле вы объявляете void **ptr, а в другом файле вы объявляете void *ptr - что не может быть правдой, так как два ptr имеют одинаковую семантику (каждый из них указывает на массив из двух элементов TF и как). В одном файле у вас есть функция, которая принимает параметр с именем ptr, но в другом файле вы снова передаете содержимое переменной с именем ptr ..., так как два ptrs имеют одинаковую семантику, это несоответствие Должно быть неправильно, и ясно, что разыменование является неправильным. Удалите это, и вы передадите void**, так что это должен быть параметр func.

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

0 голосов
/ 24 февраля 2012

А чего ты ожидал?Параметр функции ptr является указателем на «что-то» (то есть void).Вы разыменовываете этот указатель с помощью ptr[0] и ptr[1], пытаясь извлечь «что-то».Но компилятор не знает тип или размер "что-то".

Что вы, вероятно, хотите, это:

func(ptr);

и это:

void func(void** ptr)
{
...
}
0 голосов
/ 24 февраля 2012

В func, где ptr объявлено как void*, ptr[0] соответствует *ptr, а ptr[1] соответствует *(ptr + 1).Вы пытаетесь разыменовать указатель void, как говорит ваш компилятор.

Если вы хотите передать массив void указателей на func, то вы должны внести следующие изменения:

  • Измените подпись func на:

    void func(void **ptr)

  • Измените func(*ptr); на просто func(ptr);передать динамически распределенный массив ptr в функцию.

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

void **ptr = kmalloc(sizeof(void *) * 2);

или даже:

void **ptr = kmalloc(sizeof(*ptr) * 2);
...