Присвоить значения разыменованному пустому указателю - PullRequest
9 голосов
/ 16 августа 2011

Я делаю класс в C ++, который поддерживает любые переменные, чтобы помочь мне в будущем проекте.Дело в том, что когда я пытаюсь присвоить значение переменной void*, я получаю ошибку: void* не является указателем на тип объекта.Вот код:

int main (void) {
    void* a;
    int x;
    a = malloc(sizeof(int));
    x = 120;
    ((int)(*a)) = x;
    printf("%d",((int)*a));
    free(a);
    system("pause");
    return 0;
}

Я вижу, что пытаюсь присвоить значение x в блоке памяти, зарезервированном для a.Я хочу, чтобы значение, хранящееся в x, сохранялось в блоке памяти a.Может ли any1 помочь мне?

Ответы [ 5 ]

5 голосов
/ 16 августа 2011

Вы, вероятно, хотите сделать:

void* a;
int x;
a = malloc(sizeof(int));
x = 120;
*(int*)a = x;
printf("%d", * (int*)a);
free(a);
3 голосов
/ 16 августа 2011

Ты делаешь это слишком сложным. Просто приведите a к значению int * или, что еще лучше, объявите a как int * для начала.

int x = 120;
int * a ;
// now just cast the result from malloc as int*
if((a = (int *)malloc(sizeof(int))) == NULL){ //ALWAYS check
   exit(-1);
}
*a = x;

Существуют более изощренные способы делать подобные вещи в C ++, но вы, кажется, в основном пойманы синтаксисом указателя.

3 голосов
/ 16 августа 2011

Вы должны сыграть как *(int*)(a) = x;.

3 голосов
/ 16 августа 2011

Во-первых, вы должны привести a к соответствующему типу указателя и , затем прекратить обращение к нему.Во-вторых, используйте шаблон - вот для чего они.В-третьих, malloc и free - это baaaad, хорошо?Не.Если вы думаете, что это хороший код, вам нужно серьезное исправление C ++.В-четвертых, это уже сделано - boost::any служит этой цели.

0 голосов
/ 16 августа 2011

Существуют и другие элегантные способы присвоения переменной разных типов. Для вашего текущего вопроса вы можете следовать стандартным способом, как,

int* const a = new int;
//...
*a = 120;
//...
delete a;

Или специально для этой проблемы

int a = 120; // simple

[Примечание: в вашем текущем решении, если вы делаете,

*((int*)(a)) = x;

это может нарушать строгое правило наложения имен.]

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