如何在块的内存中存储4个字节的整数值,该块被malloced作为类型char

时间:2010-03-25 11:42:29

标签: c type-conversion

我已经分配了一大块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,这就是问题所在。

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

5 个答案:

答案 0 :(得分:5)

您需要将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的指针,而只是假装暂时,好吗?”

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你也可以记住...中的值

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

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

答案 3 :(得分:1)

没有演员阵容的一种方法:

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

答案 4 :(得分:0)

对风格的评论:不要这样做:

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

没有错
ptr = malloc();
if (ptr == NULL) ...

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

对于假设C中的int总是32位的所有海报都是-1,包括线程标题中的OP。 int保证至少有16位,在32位机器上通常可以安全地假设有32位,但是一旦你移动到64位机器,你的代码就会失败。