提问人:NeuronB 提问时间:5/8/2023 最后编辑:Vlad from MoscowNeuronB 更新时间:5/8/2023 访问量:134
malloc 的默认值是否为单个字符 P 的大小?
Is the default value of malloc with the size of a single char P?
问:
char *ptr = malloc(sizeof(char));
printf("\nValue of ptr: %d\n",ptr);
printf("\nValue of address of ptr: %x\n",&ptr);
printf("\nValue of pointed by ptr: %c\n",*ptr);
printf("\nValue of address pointed by ptr: %x\n",&(*ptr));
*ptr='u';
printf("\nValue of pointed by ptr: %c\n",*ptr);
printf("\nValue of address pointed by ptr: %x\n",&(*ptr));
在上面的代码段中,收到以下输出:
Value of ptr: 1046113600
Value of address of ptr: a2fffa78
Value of pointed by ptr: P
Value of address pointed by ptr: 3e5a6d40
Value of pointed by ptr: u
Value of address pointed by ptr: 3e5a6d40
这是否意味着具有单个字符大小的 malloc 的默认值为 P?
尝试使用 malloc 分配单个字符大小的内存,并初始化指向已分配内存的指针。已尝试打印已分配内存的值。
答:
8赞
paddy
5/8/2023
#1
没有“默认值”,因为不会初始化内存。它的价值是不确定的。要初始化内存,您可以改用分配所有字节并将其设置为零,也可以自己初始化内存。malloc
calloc
评论
0赞
NeuronB
5/8/2023
谢谢@paddy。通过“自己初始化内存”,您的意思是 *ptr='u' 之类的东西吗?
1赞
paddy
5/9/2023
是的,类似的东西。
6赞
Vlad from Moscow
5/8/2023
#2
malloc
在不初始化内存的情况下分配内存。因此,分配的内存可以包含任何一组位值。不使用默认值。
与 malloc 相反,您可以使用另一个分配函数,该函数将分配的内存初始化为零,例如calloc
char *ptr = calloc(1, sizeof(char));
请注意,printf 对指针的输出值的此类调用,例如
printf("\nValue of ptr: %d\n",ptr);
printf("\nValue of address of ptr: %x\n",&ptr);
无效且具有未定义的行为。特别是,例如,转换说明符设计用于输出类型的整数,并且可以等于 while 可以等于 。d
int
sizeof( int )
4
sizeof( char * )
8
来自 C 标准(7.21.6.1 fprintf 函数)
9 如果转换规范无效,则行为是 undefined.275) 如果任何参数不是 相应的转换规范,行为是未定义的。
例如,您应该使用带有指针的转换说明符p
printf("\nValue of ptr: %p\n", ( void * )ptr);
或标头中定义的转换说明符<inttypes.h>
#include <inttypes.h>
//...
printf("\nValue of ptr: %" PRIdPTR "\n", ( intptr_t )( void * )ptr);
评论
0赞
NeuronB
5/8/2023
来自莫斯科的@Vlad,非常感谢您的详细回答。你能帮我澄清一些问题或困惑吗?所以这里的 ptr 指向一个未初始化的内存分配(char *ptr=malloc)。现在我的问题是输出 ptr(使用 %p)是否会返回已分配内存的地址,还是会返回变量 ptr(指向已分配内存)的值,或者两者是否相同?
1赞
ryyker
5/8/2023
@NeuronB - 变量的值恰好是一个数字,对应于内存中的地址。它们是一样的。格式说明符需要指针,并将输出该值。输出内存内容,如您在问题中所示:(对措辞稍作编辑。ptr
%p
printf("\nValue contained in memory pointed to by ptr: %c\n",*ptr);
0赞
NeuronB
5/8/2023
感谢@ryyker对此的解释。非常感谢。因此,您刚刚评论的行似乎确实在 malloc 之后输出了一个字符(在本例中为 P)。是垃圾值吗?
1赞
Vlad from Moscow
5/8/2023
@NeuronB 你是对的。这是一个垃圾值。
评论
%p
%d or
&(*ptr)
ptr
&*
*&
1046113600
0x3E5A6D40
malloc