Как сохранить int в char *, который назначен malloc - PullRequest
2 голосов
/ 29 марта 2019

Я пытался сохранить значение типа int (все 4 байта) в char *:

Итак, я хотел бы сохранить полное значение, то есть все байты (все 4) переменной int, в char, чтобы я использовал 4 байта из 512 байтов. Я также должен быть в состоянии прочитать обратно значение, которое я назначил. Я пытался использовать много вещей, но не мог понять это.

Это для моей LFS (Log File System), где я пытаюсь сохранить файлы в блоки данных на моем диске, используя фрагментацию данных

char *c = malloc(512);
int value = 4096;

Ответы [ 4 ]

4 голосов
/ 29 марта 2019

Вы можете скопировать в буфер, на который указывает c:

memcpy(c, &value, sizeof(value));

Если вы хотите записать другое значение после этого, вы можете добавить смещение к c:

memcpy(c + sizeof(value), &value2, sizeof(value2));  // adds value2 at an offset right after value

Чтобы прочитать значение, вы можете скопировать его в другую переменную:

int readVal;
memcpy(&readVal, c, sizeof(readVal));
2 голосов
/ 29 марта 2019

Прошло много времени с тех пор, как я написал C или C ++, но я верю, что вы можете использовать memcpy, чтобы делать то, что вы хотите.

memcpy(c, &value, 4);

Это должно скопировать 4 байта с адреса значения в байты, которые вы выделили из c.Если вы хотите быть уверены в размере целого числа, вы можете использовать sizeof (int) вместо 4. Так что это будет

memcpy(c, &value, sizeof(int));
1 голос
/ 29 марта 2019

Можно использовать union для прямой записи в значение,

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h> /* C99 */

union Block {
    char c[512];
    int32_t d;
};

int main(void) {
    union Block *b;
    if(!(b = malloc(sizeof *b))) return perror("?"), EXIT_FAILURE;
    b->d = 4096;
    printf("%d\n", b->d);
    return 0;
}

Здесь я использовал C99 int32_t, чтобы обеспечить его 32-битное значение.Тем не менее, порядок битов (что такое b->c[0]?) Зависит от того, используется ли младший или старший порядок байтов.

1 голос
/ 29 марта 2019

Можно использовать дополнительные указатели.
Привести указатель на символ, чтобы сделать его доступным для указателя типа int.Указатель int может использоваться как массив и может быть легко назначен или напечатан.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void) {
    char *line = malloc ( 512);
    char *text = line + sizeof ( int) * 2;//reserve space for two int
    int *value = (int *)line;//cast to int pointer
    value[0] = 4096;//or *value = 4096;
    value[1] = 25;
    strcpy ( text, "text and more text");
    printf ( "%d\n", value[0]);//or printf ( "%d\n", *value);
    printf ( "%d\n", value[1]);
    printf ( "%s\n", text);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...