C 打印解除防护的值会引发警告
我只是在用C做一些大学练习。目前我正在用vscode和C/C++在我的“原生环境”中编写C 但是当我试图打印一个延迟的值时,GCC在编译时抛出警告。 看看这个:C 打印解除防护的值会引发警告,c,C,我只是在用C做一些大学练习。目前我正在用vscode和C/C++在我的“原生环境”中编写C 但是当我试图打印一个延迟的值时,GCC在编译时抛出警告。 看看这个: #include <stdio.h> #include <stdlib.h> int main (void) { int x = 10; double y = 20.50; char z = 'a'; int *pointer_x = &x; doub
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int x = 10;
double y = 20.50;
char z = 'a';
int *pointer_x = &x;
double *pointer_y = &y;
char *pointer_z = &z;
double sum = *pointer_x + *pointer_y;
printf("Endereço de x = %i\nValor referência de x = %i\n\n", pointer_x, *pointer_x);
printf("Endereço de y = %i\nValor referência de y = %f\n\n", pointer_y, *pointer_y);
printf("Endereço de z = %i\nValor referência de z = %c\n\n", pointer_z, *pointer_z);
printf("O Valor da soma entre x e y é = %f\n\n", sum);
getchar();
return 0;
}
我做错了什么?我真的想在第二个参数中显示reference(我不想显示address)值,这就是为什么我使用了deference操作符。所以我不明白这些警告是真是假,有人能帮我吗?这些警告是真的,它们是针对你的第一个论点,而不是第二个论点。
也就是说,格式字符串后的第一个参数,即
printf的“参数1”-这就是警告状态为“参数2”的原因
您正试图用%i
打印地址,但应使用%p
:
printf("Endereço de x = %p\nValor referência de x = %i\n\n", (void*)pointer_x, *pointer_x);
printf("Endereço de y = %p\nValor referência de y = %f\n\n", (void*)pointer_y, *pointer_y);
printf("Endereço de z = %p\nValor referência de z = %c\n\n", (void*)pointer_z, *pointer_z);
编辑:根据注释,C标准规定指针也应强制转换到void*
,以便与%p
格式化参数一起使用。警告是正确的,它们是针对第一个参数的,而不是第二个参数。
也就是说,格式字符串后的第一个参数,即printf的“参数1”-这就是警告状态为“参数2”的原因
您正试图用%i
打印地址,但应使用%p
:
printf("Endereço de x = %p\nValor referência de x = %i\n\n", (void*)pointer_x, *pointer_x);
printf("Endereço de y = %p\nValor referência de y = %f\n\n", (void*)pointer_y, *pointer_y);
printf("Endereço de z = %p\nValor referência de z = %c\n\n", (void*)pointer_z, *pointer_z);
编辑:根据注释,C标准规定指针也应强制转换到void*
,以便与%p
格式化参数一起使用。我建议使用格式说明符%p
并将地址强制转换到void*
。警告都与第一个参数有关%i
不是指针的正确格式。有趣的是,这些错误消息的GCC参数索引显然从1
2
开始,引用printf
的第二个参数,第一个参数是字符串本身。我建议使用格式说明符%p
并将地址强制转换为void*
。警告都与第一个参数有关%i
不是指针的正确格式。有趣的是,这些错误消息的GCC参数索引显然从1
2
开始,引用printf
的第二个参数,第一个参数是字符串本身。我仍然得到一个警告,但现在是警告:格式“%p”要求参数类型为“void*”,但参数2的类型为“int*”
。即使使用-Wall
,我当前的gcc编译器(apple clang 12.0.5和linux 4.8.3)也不会出现此类警告,每个指针都应该被转换到void*
@fredrarson。也就是说,在警告方面,不需要为%p
将int*
强制转换为void*
。你的配置和用途是什么?@JeffHolt:它说这是由于[-Wformat=]
,可能是-Wextra
拉进来的。请参阅。@fredrarson-Hmm。使用-Wformat
和/或-Wextra
仍然不会产生任何警告。当我要求配置时,我指的是平台和版本。@Fredrarson没有必要。MinGW说了这一切。我仍然得到了一个警告,但现在是警告:格式“%p”要求参数类型为“void*”,但参数2的类型为“int*”
。即使使用-Wall
,我当前的gcc编译器(apple clang 12.0.5和linux 4.8.3)也不会出现此类警告,每个指针都应该被转换到void*
@fredrarson。也就是说,在警告方面,不需要为%p
将int*
强制转换为void*
。你的配置和用途是什么?@JeffHolt:它说这是由于[-Wformat=]
,可能是-Wextra
拉进来的。请参阅。@fredrarson-Hmm。使用-Wformat
和/或-Wextra
仍然不会产生任何警告。当我要求配置时,我指的是平台和版本。@Fredrarson没有必要。明哥说的都是。