我已经分配了一大块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
,这就是问题所在。
我不知道如何解决这个问题..
答案 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位机器,你的代码就会失败。