Int в смоделированном массиве памяти uchar - PullRequest
0 голосов
/ 10 мая 2009

В C, в среде Unix (Plan9), я получил массив в качестве памяти.

uchar mem[32*1024];

Мне нужно, чтобы этот массив содержал различные поля, например, int (целое число), чтобы указать размер свободной и доступной памяти. Итак, я попробовал это:

uchar* memp=mem;
*memp=(int)250; //An example of size I want to assign.

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

Но проблема в том, что когда я пытаюсь сделать то, что я объяснил, это не работает. Я предполагаю, что есть ошибка с преобразованием типов. Надеюсь, я вас спрашиваю, как я могу заставить то, что mem [0] в mem [3] будет иметь указанный размер, представленный как int, а no как uchar?

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 10 мая 2009

Рассматривали ли вы использование союза, как в:

union mem_with_size {
  int   size;
  uchar mem[32*1024];
};

Тогда вам не нужно беспокоиться о кастинге. (Конечно, вам все равно придется беспокоиться о порядке следования байтов, но это другая проблема.)

2 голосов
/ 10 мая 2009

Как это:

*((int*) memp) = 250;

Это говорит: «Хотя memp является указателем на символы, я хочу, чтобы вы рассматривали его как указатель на целые числа, и поместите это целое число туда, куда он указывает."

1 голос
/ 10 мая 2009

Как уже отмечали другие, вам нужно привести к указателю на int. Вы также должны убедиться, что вы учитываете выравнивание указателя: во многих архитектурах int должен начинаться с области памяти, которая делится на sizeof (int), и если вы пытаетесь получить доступ к невыровненному int, вы SIGBUS. На других архитектурах это работает, но медленно. На других он работает быстро.

Портативный способ сделать это может быть:

int x = 250;
memcpy(mem + offset, &x, sizeof(x));

Использование союзов может сделать это проще, поэтому +1 к JamieH.

0 голосов
/ 10 мая 2009

Приведите указатель к int, а не unsigned char снова!

int * memp = (int *)mem;
* memp = 250; //An example of size I want to assign.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...