user-0 提问: 数组下标为unsigned char时

回复:
user: user-1
content: int b[300];   9         for(i=0;i<300;i++){ 如果想验证下表（unsigned char)到255之后就变成0，可以这样测试一下～

user: user-2
content: 我随便写了个测试程序： struct TEST{ int t_a[2]; int t_b; };  main里： struct TEST tt; tt.t_a[0] = 1; tt.t_a[1] = 2; tt.t_b = 3; printf("%d %d %d",tt.t_a[0],tt.t_a[1],tt.t_a[2]);  结果是 ： 1 2 3  越界什么规律？就是往后又读了一段长度呗。  首先我为什么用结构体测试： 在一个结构体的话,两个成员应该是挨着在内存上分配空间的。我们常把结构体指针转成 void* 类型又能再转回来结构体，应该就是因为这个。 然后为什么两个都是int： 越界之后应该是又读了一个int长度，长度不同应该会出错吧。 变量，应该就是拿着那个类型的长度，按首地址去内存上取数据吧。 你越界了是0，大概是后面的内存上没东西吧  我把tt_b注释掉之后的结果是 ：-1623938304 等等 一直在变化  另外我把代码改成： struct TEST{ int t_a[2]; };  struct TEST tt; int bb = 10; tt.t_a[0] = 1; tt.t_a[1] = 2; printf("%d %d %d",tt.t_a[0],tt.t_a[1],tt.t_a[2]);  得到的结果依旧是乱码。由此可见就算你是连续定义了俩变量，内存上也并不一定紧挨着。  以上全是我个人对代码和内存的理解。抱歉我没学过什么书，专业的话讲不来。

user: user-3
content: 引用 8 楼 weixin_45528310 的回复:[quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote] 访问不可访问的内存时才会段错误,c/c++不会对越界进行检查.b和i的内存是连续的,b的内存访问越界后就会访问到i的地址去,具体的原理你还是去看下相关的书吧

user: user-0
content: 引用 11 楼 user-4的回复:[quote=引用 10 楼 weixin_45528310 的回复:] [quote=引用 9 楼 user-4的回复:][quote=引用 8 楼 weixin_45528310 的回复:] [quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote]  选死循环和越界？肯定是越界  至于会不会死循环，这个是不能确定的，越界的后果可能是死循环，有可能是程序崩溃。但是我可以告诉你，我见过一个越界了的程序，平安无事的跑了很长一段时间吗？（实际情况是确实是越界了）[/quote] 曾经老师给我说你纠结他乱码规则干什么。但是这个越界确实有规律啊。只要一越界就会归零。而且测试是了很多次。[/quote]  建议你带着十万个为什么去学习编译原理和汇编程序[/quote] 可以我会好好去看的。thank you.

user: user-4
content: 引用 10 楼 weixin_45528310 的回复:[quote=引用 9 楼 user-4的回复:][quote=引用 8 楼 weixin_45528310 的回复:] [quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote]  选死循环和越界？肯定是越界  至于会不会死循环，这个是不能确定的，越界的后果可能是死循环，有可能是程序崩溃。但是我可以告诉你，我见过一个越界了的程序，平安无事的跑了很长一段时间吗？（实际情况是确实是越界了）[/quote] 曾经老师给我说你纠结他乱码规则干什么。但是这个越界确实有规律啊。只要一越界就会归零。而且测试是了很多次。[/quote]  建议你带着十万个为什么去学习编译原理和汇编程序

user: user-0
content: 引用 9 楼 user-4的回复:[quote=引用 8 楼 weixin_45528310 的回复:] [quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote]  选死循环和越界？肯定是越界  至于会不会死循环，这个是不能确定的，越界的后果可能是死循环，有可能是程序崩溃。但是我可以告诉你，我见过一个越界了的程序，平安无事的跑了很长一段时间吗？（实际情况是确实是越界了）[/quote] 曾经老师给我说你纠结他乱码规则干什么。但是这个越界确实有规律啊。只要一越界就会归零。而且测试是了很多次。

user: user-4
content: 引用 8 楼 weixin_45528310 的回复:[quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote]  选死循环和越界？肯定是越界  至于会不会死循环，这个是不能确定的，越界的后果可能是死循环，有可能是程序崩溃。但是我可以告诉你，我见过一个越界了的程序，平安无事的跑了很长一段时间吗？（实际情况是确实是越界了）

user: user-0
content: 引用 7 楼 Mapleas的回复:你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。

user: user-3
content: 你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00.

user: user-4
content: 引用 2 楼 weixin_45528310 的回复:[quote=引用 1 楼 Mapleas的回复:]unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0 说清楚点你这些我都知道[/quote]  你数组b的空间是20，但是循环下标都到了29，数组越界了

user: user-4
content: 引用 1 楼 Mapleas 的回复:unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0  unsigned char是0~255，char是-128~127，当累加到256的时候，都会回到0

user: user-3
content: 引用 3 楼 weixin_45528310 的回复:[quote=引用 1 楼 Mapleas的回复:]unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0 还有你错了是0到255不是－255[/quote] 你要什么的解释,另外-255是打错

user: user-0
content: 引用 1 楼 Mapleas的回复:unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0 还有你错了是0到255不是－255

user: user-0
content: 引用 1 楼 Mapleas的回复:unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0 说清楚点你这些我都知道

user: user-3
content: unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0