malloc的默认值是单个char P的大小吗?

Neu*_*onB 3 c malloc pointers char conversion-specifier

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));
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,收到以下输出:

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
Run Code Online (Sandbox Code Playgroud)

这是否意味着具有单个字符大小的malloc的默认值为P?

尝试使用 malloc 分配单个字符大小的内存,并初始化指向分配的内存的指针。尝试打印分配的内存的值。

pad*_*ddy 8

没有“默认值”,因为malloc不初始化内存。其价值是不确定的。要初始化内存,您可以使用calloc分配然后将所有字节设置为零,或者您可以自己初始化内存。


Vla*_*cow 6

malloc分配内存而不初始化它。因此分配的内存可以包含任何位值集。两个默认值都不使用。

与 malloc 相反,您可以使用另一个分配函数calloc,该函数将分配的内存初始化为零,例如

char *ptr = calloc(1, sizeof(char));
Run Code Online (Sandbox Code Playgroud)

请注意 printf 的此类调用会输出指针值,例如

printf("\nValue of ptr: %d\n",ptr);
printf("\nValue of address of ptr: %x\n",&ptr);
Run Code Online (Sandbox Code Playgroud)

无效并且具有未定义的行为。特别地,例如转换说明符d被设计为输出类型的整数int并且sizeof( int )可以等于4sizeof( char * )可以等于8

来自 C 标准(7.21.6.1 fprintf 函数)

9 如果转换规范无效,则行为未定义。275) 如果任何参数不是相应转换规范的正确类型,则行为未定义。

您应该使用带有指针的转换说明符,p例如

printf("\nValue of ptr: %p\n", ( void * )ptr);
Run Code Online (Sandbox Code Playgroud)

或标头中定义的转换说明符<inttypes.h>

#include <inttypes.h>

//...

printf("\nValue of ptr: %" PRIdPTR "\n", ( intptr_t )( void * )ptr);
Run Code Online (Sandbox Code Playgroud)