malloc返回负值

时间:2012-03-07 18:05:12

标签: c

我在硬件上运行这段代码。

unsigned char *buf;

buf = malloc(sizeof(int));
printf("Address of buf %d\n" , &buf);

if(!buf)
    return MEMORYALLOC_FAILURE;

malloc正在返回负值。可能是什么问题?

5 个答案:

答案 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,那么这意味着你无法分配那个内存。