我在硬件上运行这段代码。
unsigned char *buf;
buf = malloc(sizeof(int));
printf("Address of buf %d\n" , &buf);
if(!buf)
return MEMORYALLOC_FAILURE;
malloc
正在返回负值。可能是什么问题?
答案 0 :(得分:10)
malloc返回的地址不是负数或正数,只是地址,使用%p打印,而不是%d:
printf("Address of buf %p\n" , &buf);
如果要打印从malloc返回的地址,请删除&符号:
printf("Address of buf %p\n" , buf);
答案 1 :(得分:4)
您将内存位置的地址打印为有符号整数。如果内存地址 - 例如在32位机器上 - 超过2,147,483,647(0x7FFFFFFF),它将显示为负数。
在这种情况下,您还要在堆栈上打印局部变量的地址,而不是malloc
返回的地址。
使用%d
打印指针大小的值的错误是指针的大小可能不同。因此,正确的方法是使用printf
specifier作为指针%p
:
// nb: we don't take the address of buf,
// buf is already a pointer (thus its *value* is an address)
printf("Address of buf %p\n", buf);
答案 2 :(得分:2)
类型不匹配:
您尝试使用int
("%d"
)的说明符打印地址。您应该使用"%p"
并将值转换为void*
printf("Address of buf %p\n" , (void*)&buf);
另请注意,上面的内容不会告诉您分配的内存在哪里。为此你需要
printf("Address of newly allocated memory %p\n" , (void*)buf);
void*
的强制转换是由the C99 standard强制执行的(强调是我的)
参数应该是指向void 的指针。指针的值以实现定义的方式转换为打印字符序列。
另请注意,指向void的指针不必与指向其他类型的指针具有相同的表示形式。
答案 3 :(得分:1)
malloc
返回NULL(也称为0)或内存地址。内存地址不能为负数。您刚刚将指针本身转换为数字,从而产生负数。
答案 4 :(得分:0)
malloc
返回一个指针。它永远不会返回负值。如果你认为那么你可能会破坏一切。另一方面,如果你的意思是它返回null pointer
,那么这意味着你无法分配那个内存。