【问题标题】:How to store an int in a char * that is assigned by malloc如何将 int 存储在由 malloc 分配的 char * 中
【发布时间】:2019-08-20 17:14:50
【问题描述】:

我试图将一个 int 值(全部 4 个字节)存储到 char *

所以,我想将完整值,即 int 变量的所有字节(全部 4 个)存储到 char 中,这样我就用完了 512 个字节中的 4 个字节。我也应该能够读回我分配的值。我尝试使用很多东西,但无法弄清楚。

这适用于我的 LFS(日志文件系统),我尝试使用数据碎片将文件存储到磁盘上的数据块中

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

【问题讨论】:

  • 分配 512 字节只使用 4 是昂贵的。 memcpy 之后的警告,结果取决于你是大端还是小端,没有什么说 int 总是在 4 个字节上

标签: c


【解决方案1】:

可以使用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-&gt;c[0] 是什么?)取决于使用的是小端还是大端。

【讨论】:

    【解决方案2】:

    可以使用其他指针。
    转换 char 指针以使其可用于 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;
    }
    

    【讨论】:

    • 您好@Xing,了解如何将int 和text 添加到内存位置并同时保留它们的内存绝对很有用。我感谢你的努力! :)
    【解决方案3】:

    可以复制到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));
    

    【讨论】:

    • 谢谢@ODYN-Kon。很有帮助:)
    • 这里不需要括号:sizeof(value) 使用sizeof value 就可以了。 sizeof 是运算符而不是函数。
    【解决方案4】:

    自从我编写 C 或 C++ 以来已经有一段时间了,但我相信你可以使用 memcpy 来做你想做的事。

    memcpy(c, &value, 4);
    

    这应该将 value 地址中的 4 个字节复制到您从 c 分配的字节中。如果你想确定整数的大小,你可以使用 sizeof(int) 而不是 4。那就是

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

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 2015-07-12
      • 1970-01-01
      • 2021-11-22
      • 2012-12-10
      • 2018-02-03
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多