#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.
答案 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.
位数取决于系统使用的内存布局。