Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印解除防护的值会引发警告_C - Fatal编程技术网

C 打印解除防护的值会引发警告

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

我只是在用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;
    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没有必要。明哥说的都是。