【问题标题】:How to store an integer value of 4 bytes in a memory of chunk which is malloced as type char如何将 4 个字节的整数值存储在分配为 char 类型的块的内存中
【发布时间】:2011-01-31 16:28:56
【问题描述】:

我分配了一块 char 类型的内存,大小为 10 MB(即 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 类型,它只占用一个字节,但我试图存储占用 4 个字节的 int,这是问题所在。

我不知道如何解决这个问题..

【问题讨论】:

  • 请添加实际失败的代码。
  • char *start_ptr; int toCopy = mem_size*1024*1024; if((start_ptr= malloc(mem_size*1024*1024*sizeof(char)))==NULL) {return -1;} //memcpy(start_ptr,&toCopy,4); //*((int *)start_ptr) = mem_size*1024*1024; //*start_ptr = 'A'; printf("存储在 %p 的值是 %d \n", start_ptr, *start_ptr);我从这个站点了解了几种方法,一种是 memcpy,第二种是类型转换。但我想从 printf 语句中打印出所需的值。它总是给我0
  • 您需要在 printf 中为 %d 转换 start_ptr:*(int)start_ptr.

标签: c type-conversion


【解决方案1】:

关于风格的评论:不要这样做:

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

没有错

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

优秀的程序员知道他们可以用这门语言做什么。优秀的程序员知道他们为什么不应该这样做。 ;)

对于所有假定 C 中的 int 始终为 32 位的发帖者,包括线程标题中的 OP,为 -1。一个 int 保证至少有 16 位,在 32 位机器上通常安全的假设是有 32 位,但是一旦你转移到 64 位机器,你的代码可能会失败。

【讨论】:

    【解决方案2】:

    一种无需强制转换的方法:

    #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;
    

    【讨论】:

      【解决方案3】:

      您也可以只 memcpy 中的值 ...

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

      您甚至会惊讶于大多数编译器甚至不会进行 memcpy 调用,而只会设置值。

      【讨论】:

      • 在这种情况下,如何打印我存储的值..我正在尝试这种方法,但它在 start_addr 处给出 0 ..我想确保该值实际存储在那个位置。
      【解决方案4】:

      您需要将 char 指针转换为 int 指针。分两步:

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

      一步到位:

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

      指针名称前面的(int*) 告诉编译器:“是的,我知道这实际上不是指向int 的指针,但暂时只是假装,好吗?”

      【讨论】:

      • 感谢托马斯的回答。这是有道理的..但是给你一个快速的问题。如何打印该地址的值。如果我做 printf("%d ",*start_ptr);在那个地址它仍然给我 0..我犯了一些错误..
      • @Adi:您也需要在 printf 中转换回 int ,例如。 printf("%d", * ((int *)start_ptr))
      【解决方案5】:
      *((int*)start_ptr) = mem_size*1024*1024
      

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 2017-08-25
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 2017-09-29
        相关资源
        最近更新 更多