我的代码是:
#include <stdio.h>
#include <string.h>
void main()
{
char string[10];
int A = -73;
unsigned int B = 31337;
strcpy(string, "sample");
// printing with different formats
printf("[A] Dec: %d, Hex: %x, Unsigned: %u\n", A,A,A);
printf("[B] Dec: %d, Hex: %x, Unsigned: %u\n", B,B,B);
printf("[field width on B] 3: '%3u', 10: '%10u', '%08u'\n", B,B,B);
// Example of unary address operator (dereferencing) and a %x
// format string
printf("variable A is at address: %08x\n", &A);
我正在使用Linux mint中的终端进行编译,当我尝试使用gcc进行编译时,出现以下错误消息:
basicStringFormatting.c: In function ‘main’:
basicStringFormatting.c:18:2: warning: format ‘%x’ expects argument
of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("variable A is at address: %08x\n", &A);
我想做的就是在变量A的内存中打印地址。
使用格式说明符%p
:
printf("variable A is at address: %p\n", (void*)&A);
标准要求void*
说明符的参数类型为%p
。由于printf
是一个可变函数,因此没有从void *
隐式转换为T *
的情况,这对于C中的任何非变量函数都将隐式发生。因此,需要强制转换。引用标准:
7.21.6格式化的输入/输出功能(C11草案)
p参数应为指向void的指针。指针的值是转换为一系列打印字符实现定义的方式。
[您正在使用%x
,它需要unsigned int
,而&A
是int *
类型。您可以阅读有关printf from the manual的格式说明符。 printf中的格式说明符不匹配会导致undefined behaviour。
使用带有长度说明符的%x
来打印int
或unsigned int
而不使编译器抱怨转换的解决方法是使用malloc:
unsigned int* D = malloc(sizeof(unsigned int)); // Allocate D
unsigned int D_address = *((unsigned int*) &D); // D address for %08x without warning
*D = 75; // D value
printf("variable D is at address: %p / 0x%08x with value: %u\n", D, D_address, *D);
或者,您也可以使用gcc -w
标志进行编译,以禁止显示这些转换警告。