Как сохранить целочисленное значение 4 байта в памяти чанка, который выдается как тип char - PullRequest
3 голосов
/ 25 марта 2010

Я выделил кусок памяти типа char, и его размер, скажем, 10 МБ (т. Е. Mem_size = 10):

int mem_size = 10; 
char *start_ptr;
if((start_ptr= malloc(mem_size*1024*1024*sizeof(char)))==NULL) {return -1;}

Теперь я хочу сохранить информацию о размере в заголовке блока памяти. Чтобы сделать себя более понятным, скажем: start_ptr = 0xaf868004 (это значение, которое я получил от своего выполнения, оно меняется каждый раз). *

Теперь я хочу поместить информацию о размере в начало этого указателя, т.е. *start_ptr = mem_size*1024*1024;.

Но я не могу поместить эту информацию в start_ptr. Я думаю, причина в том, что мой ptr имеет тип char, который занимает всего один байт, но я пытаюсь сохранить int, который занимает 4 байта, это проблема.

Я не уверен, как решить эту проблему ..

Ответы [ 5 ]

5 голосов
/ 25 марта 2010

Вам нужно будет привести ваш char указатель к int указателю. В два этапа:

int *start_ptr_int = (int*)start_ptr;
*start_ptr_int = mem_size * 1024 * 1024;

За один шаг:

*((int*)start_ptr) = mem_size * 1024 * 1024;

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

1 голос
/ 25 марта 2010

Один из способов сделать это без приведения:

#include <stdlib.h>
struct Block {
    size_t size;
    char data[];
};
#define SIZE (1024*1024)
int main()
{
    struct Block* block = malloc(sizeof(struct Block) + SIZE);
    block->size = SIZE;
    char* start_ptr = block->data;
    // ...
}

Или, чтобы получить желаемый эффект, измените одну строку:

char* start_ptr = (char*)block;
1 голос
/ 25 марта 2010

Вы также можете просто запомнить значение в ...

е

int toCopy = mem_size * 1024 * 1024;
memcpy( start_ptr, &toCopy, 4 );

Вы даже удивитесь, что большинство компиляторов даже не вызовут memcpy и просто установят значение.

1 голос
/ 25 марта 2010
*((int*)start_ptr) = mem_size*1024*1024
0 голосов
/ 25 марта 2010

Комментарий к стилю: не делайте этого:

if ((ptr=malloc()) == NULL)

Нет ничего плохого в

ptr = malloc();
if (ptr == NULL) ...

Хорошие программисты знают, что они могут сделать с языком. Отличные программисты знают, почему они не должны этого делать. ;)

И -1 всем постерам, которые предполагают, что int в C всегда будет 32-битным, включая OP в заголовке потока. У int гарантированно должно быть не менее 16 бит, а на 32-битных машинах обычно считается безопасным 32-битное кодирование, но ваш код может перестать работать, как только вы перейдете на 64-битную машину.

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