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 分配单个字符大小的内存,并初始化指向分配的内存的指针。尝试打印分配的内存的值。
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 )可以等于4而sizeof( 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)