user-0 提问: 可能与static相关的一个问题

回复:
user: user-1
content: 引用 7 楼 Daydream_realize 的回复:[quote=引用 4 楼 自信男孩 的回复:]这个问题跟有没有static没有关系，建议楼主试一下把ch改成unsigned int ch;再测试任何情况：1）加static和不加；2）加int i = 0;和不加int i = 0;（注释掉）；  个人认为（测试一样）是一样的，不会出现全是1的问题。  原因是%x是对unsigned int而言的，如果用unsigned char去接收这个输入的值，那么势必会越界呢，并且ch和len很近，所以越界先覆盖的就是len变量；  为了解决这个问题，把ch定义为unsigned int比较妥当，因为这样不会出现越界问题，也不会出现不可判定的问题。  当然，加不加int i = 0;和static的问题都是这个引起的。  unsigned int char ch;就是原来的代码，但是原来代码在赋值的时候又加了一个强制类型转换(unsigned char)ch，所以我很奇怪为什么不直接用unsigned char ch，才做了这些试验。 不太明白你说的势必会越界的问题，char有8bit位，%1x只有4bit位，怎么会越界呢？[/quote]  注意%x，先不要考虑前面的1,只是这个就要求是unsigned int，你的编译器不给你提示吗？

user: user-2
content: 我前边已说了，你错误的使用了这函数，由于不同编译器的处理不一定相同，因此出现什么样的情况都是可能的。如果想具体了解为什么建议去学一下汇编。就好比闯红灯，你是使用错误的在马路上通行方式，那么被撞，或者不被撞都是可能的。  引用 14 楼 Daydream_realize 的回复:那么另一个问题来了，详见帖子最后一图， 当我把第二个变量定义语句： static unsigned char input[300]; 的static去掉，改为： unsigned char input[300]; 程序又能正常运行了，这是为什么呢？

user: user-3
content: 应该是跟您的编译器有关系，VS2015 C++环境 int main() { 	int i = 0; 	static unsigned char input[300]; 	int len = 0; 	unsigned char ch;  	while (scanf("%1x", &ch) == 1) { 		input[len++] = ch; 		printf("%d ", len); 	} 	return 959; }

user: user-2
content: 一个c/c++程序变量分别存储在栈，堆，以及全局数据区。不同的编译器做法并不一定完全一致。 比如你这个问题，其实是涉及到站  引用 12 楼 Daydream_realize 的回复:[quote=引用 9 楼 真相重于对错 的回复:]%1x 不代表只输入一个字节宽度，而代表只接受输入的第一个字符.但是它把输入变量当作一个整形来处理，而不是一个字符型。 做个简单例子就是 unsigned char ch[4]={0xff,0xff,0xff,0xff}; scanf("%1x",ch[0]); ======= 你输入3的时候，他会把后面的数据冲掉，ch变成{0x3,0x0,0x0,0x0}; 这样说来，scanf是一个特别危险的函数了吗？ 万一scanf("%d", ch);   ，而ch是一个char类型，那么程序甚至可能出现段错误？这也太危险了吧，那scanf这种函数就不应该存在啊！[/quote] scanf本来就是有漏洞啊现在一般都用scanf_s来避免出现问题，c语言对于计算机控制比较强大，就好比让一个小朋友拿把刀，因为容易把自己伤了，于是就不让刀出现？你的问题不是因为scanf危险而造成的，而是你错误的使用了scanf。

user: user-0
content: 那么另一个问题来了，详见帖子最后一图， 当我把第二个变量定义语句： static unsigned char input[300]; 的static去掉，改为： unsigned char input[300]; 程序又能正常运行了，这是为什么呢？

user: user-0
content: 引用 11 楼 自信男孩 的回复:[quote=引用 7 楼 Daydream_realize 的回复:][quote=引用 4 楼 自信男孩 的回复:]这个问题跟有没有static没有关系，建议楼主试一下把ch改成unsigned int ch;再测试任何情况：1）加static和不加；2）加int i = 0;和不加int i = 0;（注释掉）；  个人认为（测试一样）是一样的，不会出现全是1的问题。  原因是%x是对unsigned int而言的，如果用unsigned char去接收这个输入的值，那么势必会越界呢，并且ch和len很近，所以越界先覆盖的就是len变量；  为了解决这个问题，把ch定义为unsigned int比较妥当，因为这样不会出现越界问题，也不会出现不可判定的问题。  当然，加不加int i = 0;和static的问题都是这个引起的。  unsigned int char ch;就是原来的代码，但是原来代码在赋值的时候又加了一个强制类型转换(unsigned char)ch，所以我很奇怪为什么不直接用unsigned char ch，才做了这些试验。 不太明白你说的势必会越界的问题，char有8bit位，%1x只有4bit位，怎么会越界呢？[/quote]  注意%x，先不要考虑前面的1,只是这个就要求是unsigned int，你的编译器不给你提示吗？[/quote] 编译器没有提示。 这样说来，scanf是一个特别危险的函数了吗？ 万一scanf("%d", ch);   ，而ch是一个char类型，那么程序甚至可能出现段错误？这也太危险了吧，那scanf这种函数就不应该存在啊！

user: user-0
content: 引用 9 楼 真相重于对错 的回复:%1x 不代表只输入一个字节宽度，而代表只接受输入的第一个字符.但是它把输入变量当作一个整形来处理，而不是一个字符型。 做个简单例子就是 unsigned char ch[4]={0xff,0xff,0xff,0xff}; scanf("%1x",ch[0]); ======= 你输入3的时候，他会把后面的数据冲掉，ch变成{0x3,0x0,0x0,0x0}; 这样说来，scanf是一个特别危险的函数了吗？ 万一scanf("%d", ch);   ，而ch是一个char类型，那么程序甚至可能出现段错误？这也太危险了吧，那scanf这种函数就不应该存在啊！

user: user-2
content: %1x 不代表只输入一个字节宽度，而代表只接受输入的第一个字符.但是它把输入变量当作一个整形来处理，而不是一个字符型。 做个简单例子就是 unsigned char ch[4]={0xff,0xff,0xff,0xff}; scanf("%1x",ch[0]); ======= 你输入3的时候，他会把后面的数据冲掉，ch变成{0x3,0x0,0x0,0x0};

user: user-0
content: 引用 2 楼 Minikinfish 的回复:是的啥编译器？scanf 的%x格式，默认输入是int*参数，楼主传的是char*，怀疑内存被改坏了 gcc编译的

user: user-0
content: 引用 4 楼 自信男孩 的回复:这个问题跟有没有static没有关系，建议楼主试一下把ch改成unsigned int ch;再测试任何情况：1）加static和不加；2）加int i = 0;和不加int i = 0;（注释掉）；  个人认为（测试一样）是一样的，不会出现全是1的问题。  原因是%x是对unsigned int而言的，如果用unsigned char去接收这个输入的值，那么势必会越界呢，并且ch和len很近，所以越界先覆盖的就是len变量；  为了解决这个问题，把ch定义为unsigned int比较妥当，因为这样不会出现越界问题，也不会出现不可判定的问题。  当然，加不加int i = 0;和static的问题都是这个引起的。  unsigned int char ch;就是原来的代码，但是原来代码在赋值的时候又加了一个强制类型转换(unsigned char)ch，所以我很奇怪为什么不直接用unsigned char ch，才做了这些试验。 不太明白你说的势必会越界的问题，char有8bit位，%1x只有4bit位，怎么会越界呢？

user: user-0
content: 引用 5 楼 真相重于对错 的回复:你的ch是char,却按int输入（%1x)，出现什么样的情况都是可能 ch占1个字节，即8位。 输入（%1x)，表示读取输入流中的1位数据，并当做16进制的数字，存储在ch的低4位上。 不会出现你说的情况。

user: user-2
content: 你的ch是char,却按int输入（%1x)，出现什么样的情况都是可能

user: user-1
content: 这个问题跟有没有static没有关系，建议楼主试一下把ch改成unsigned int ch;再测试任何情况：1）加static和不加；2）加int i = 0;和不加int i = 0;（注释掉）；  个人认为（测试一样）是一样的，不会出现全是1的问题。  原因是%x是对unsigned int而言的，如果用unsigned char去接收这个输入的值，那么势必会越界呢，并且ch和len很近，所以越界先覆盖的就是len变量；  为了解决这个问题，把ch定义为unsigned int比较妥当，因为这样不会出现越界问题，也不会出现不可判定的问题。  当然，加不加int i = 0;和static的问题都是这个引起的。

user: user-4
content: 或者clean以下，rebuild all

user: user-4
content: 是的啥编译器？scanf 的%x格式，默认输入是int*参数，楼主传的是char*，怀疑内存被改坏了

user: user-5
content: https://blog.csdn.net/u011499425/article/details/52751636