malloc 的默认值是否为单个字符 P 的大小?

Is the default value of malloc with the size of a single char P?

提问人:NeuronB 提问时间:5/8/2023 最后编辑:Vlad from MoscowNeuronB 更新时间:5/8/2023 访问量:134

问:

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 分配单个字符大小的内存,并初始化指向已分配内存的指针。已尝试打印已分配内存的值。

c 指针 char malloc 转换说明符

评论

4赞 Gerhardh 5/8/2023
欢迎来到 SO。您的格式说明符是错误的。要打印指针,必须使用 ,而不是 %x。%p%d or
3赞 samann 5/8/2023
该值不确定。
3赞 Gerhardh 5/8/2023
您还应该知道,这与 as 相同或相互抵消。您可以看到这与 相同。而且两者都可能不是返回的值,因为现在的地址可能是 64 位宽,而整数大多是 32 位。&(*ptr)ptr&**&10461136000x3E5A6D40malloc
1赞 Paul Lynch 5/8/2023
Neuronb ptr 是 char * 类型的变量。它的值是 malloc() 分配的内存地址(假设成功)。
1赞 Gerhardh 5/8/2023
在这种情况下,“指针变量的值”与“分配的内存的地址”相同,因为您将该地址分配给该变量。

答:

8赞 paddy 5/8/2023 #1

没有“默认值”,因为不会初始化内存。它的价值是不确定的。要初始化内存,您可以改用分配所有字节并将其设置为零,也可以自己初始化内存。malloccalloc

评论

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 可以等于 。dintsizeof( int )4sizeof( 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%pprintf("\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 你是对的。这是一个垃圾值。