我要求用户输入两个变量,首先是无符号整数
我发现指向
a
,其次是无符号字符b
。读取a
时工作正常,但在读取b
之后,a
的值为0。我发现指向
a
的指针比指向b
的指针多1。当b
大于255时,我意识到a
不再为0。所以我认为scanf
读取了b
超过一个字节,并覆盖了a
的值。#include <stdio.h>
int main ()
{
unsigned int a;
unsigned char b;
printf("a: ");
scanf("%u", &a); /* 255 */
printf("b: ");
scanf("%hhu", &b); /* 17 */
printf("a: %u\n", a); /* a: 0 */
printf("b: %u\n", b); /* b: 17 */
printf("pointer a: %u\n", &a); /* pointer a: 6422316 */
printf("pointer b: %u\n", &b); /* pointer b: 6422315 */
return 0;
}
因为我对 C 编程还不熟悉,不确定需要哪些信息才能理解我的问题。我正在使用一款 64 位处理器和以下编译器:
gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/8.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-8.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-8.2.0-3' --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --with-isl=/mingw --enable-libgomp --disable-libvtv --enable-nls --disable-build-format-warnings
Thread model: win32
gcc version 8.2.0 (MinGW.org GCC-8.2.0-3)
printf("pointer a: %u\n", &a);
应该改为printf("pointer a: %p\n", (void*)&a);
,b
的语句也应该这样修改。 - Sourav Ghosh%u
之外,行为类似于预期的未定义行为,因为布局和格式%u
用于读取无符号字符... - Antti Haapala -- Слава Україніhh
不是GNU扩展 http://port70.net/~nsz/c/c11/n1570.html#7.21.6.2p11 - Eugene Sh.