c中的unsigned int的malloc零字节

时间:2014-10-26 17:06:08

标签: c

#include<stdio.h>
#include<stdlib.h>

void main(){

unsigned int *p, a[25];
unsigned char *s = "goodcoffee";
unsigned int size, size1, size2, test_variable;

size1 = sizeof(unsigned int);
size2 = sizeof(unsigned int *);
size = sizeof(unsigned int)/sizeof(unsigned int *);

p = malloc(sizeof(unsigned int)/sizeof(unsigned int*));

test_variable = 0xFFFFFFFF;
*p = 0xFFFFFFFF;

strcpy(a,s);

printf("Size of int: %d , Size of int *: %d, Size: %d, Test variable:                     %d\n",size1,size2,size,test_variable);

printf("%s %d \n", a, *p);

return;

}

嗨,我想了解为什么会出现下面提到的行为。我需要你的帮助来了解这段代码会发生什么。这里malloc分配零字节。 (这是一个面试问题)。

输出:

 size of int: 4,  size of int *: 4, size:1 , Test_variable: -1
 goodcoffee -1

我无法理解为什么Test_variable显示-1,尽管它是unsigned int。这只发生在最后一个半字节上。我尝试给出从0到F的值范围作为最后的半字节。代码给出了不同的负值。但如果我摆脱了最后一个半字节,即Test_variable为0xFFFFFFF,则输出为268435455.

4 个答案:

答案 0 :(得分:2)

  

这里malloc正在分配零字节。

Malloc没有分配0个字节,它为你的机器分配1个字节..

size = sizeof(unsigned int)/sizeof(unsigned int*) //gives 1

所以,p指向1字节

*p = 0xFFFFFFFF;

您正试图在4中存储p字节数,而p指向1字节分配的空间。它未定义的行为。

答案 1 :(得分:2)

Printf格式%d用于打印有符号整数。使用%u打印无符号整数。有符号整数的无符号整数0xFFFFFFFF的表示为-1。

答案 2 :(得分:1)

详细了解malloc(3);它想要字节数(而不是数据项),它可能会失败。 所以代码,如果p应该包含一个无符号整数:

p = malloc(sizeof(unsigned int));
if (!p) { perror("malloc"); exit(EXIT_FAILURE); };
*p = 0xFFFFFFFF;

您的代码错误地调用了malloc,其中包含0或1 字节,这对于unsigned int来说是不够的(在我的 Debian / x86-上64台机器,sizeof(unsigned int)为4,指针需要8个字节,因此sizeof(unsigned int*)为8,因此4/8为0)。

顺便说一句,如果您的系统有,请使用valgrind。不要忘记编译所有警告&amp;调试信息(gcc -Wall -Wextra -g)。然后使用调试器gdb

答案 3 :(得分:0)

负值以2的赞美形式存储在内存中。

在你的情况下test_variable = 0xFFFFFFFF;用十进制表示-1。

这是打印在控制台上的内容。

这是它如何完成的

1 represent 00000001 in binary
1's complement of 1 is 11111110
adding 1 gives 11111111=> represent ffff.

位数取决于系统使用的内存布局。