user-0 提问: 新手关于c语言知识   求教谢谢

回复:
user: user-1
content: 在内存中申请了两块大小为10字节的内存区，存放于栈区，由于mac中c语言编译运行中内存是向上生长的，所以内存中地址如下所示

user: user-2
content: 引用 12 楼 qq_35555558 的回复:[quote=引用 11 楼 liups 的回复:] [quote=引用 9 楼 qq_35555558 的回复:] [quote=引用 7 楼 liups 的回复:] printf("output 4:%x, %x\n", name_p,name_p2); 加这句，观察结果    出来是字母加数字的结合。。。说明了什么[/quote]  %x是以16进制输出，也就是分别输出name和name2的地址，你不会不知道吧？！[/quote]    。。。。。 我现在的水平就是个hello world[/quote] 就这个研究越界问题？

user: user-2
content: name:0011-0020，由于输入12个字符（再加上结束标记） 所以，0011-0023都被占用了，那么首先是0021-0023是分配给谁的，如果刚好是空闲的，这里没有大问题，没有其他变量被覆盖  接下来，  strcpy(name2, name);  这个会出现如下现象： 0001-0013："123456789012"，实际上name的前3个被修改了（巧合的是前2个和原来一样），但是原来第3个由'3'变成了'\0'，相当于name变成了"12"  以上仅限于楼主17楼描述的内存状况，实际上我的测试结果和你是不一样的（大家用的编译器不一样）  小结：不要去越界，因为你不知道会发生什么

user: user-0
content: 引用 14 楼 liups 的回复:[quote=引用 12 楼 qq_35555558 的回复:] [quote=引用 11 楼 liups 的回复:] [quote=引用 9 楼 qq_35555558 的回复:] [quote=引用 7 楼 liups 的回复:] printf("output 4:%x, %x\n", name_p,name_p2); 加这句，观察结果    出来是字母加数字的结合。。。说明了什么[/quote]    %x是以16进制输出，也就是分别输出name和name2的地址，你不会不知道吧？！[/quote]    。。。。。 我现在的水平就是个hello world[/quote] 就这个研究越界问题？[/quote]             char name[10];     char name2[10]; 在内存中申请了两块大小为10字节的内存区，存放于栈区，由于mac中c语言编译运行中内存是向上生长的，所以内存中地址如下所示： 地址：0001-0010，0011-0020 变量名：name2，name1 scanf("%s", name); #输入123456789012是内存中各位置中数据是这样的： 地址：0001-0010，0011-0020, 0021,0023 数据：??????????, 1234567890, 12'\0'???????  又给点提示。。。

user: user-0
content: 引用 13 楼 zxhuser-3 的回复:数组越界...没事别做这么危险的事     跟分配内存有关系，但是具体不知道。。。能帮一下么

user: user-0
content: 引用 13 楼 zxhuser-3 的回复:数组越界...没事别做这么危险的事   越了呢 会怎样？为什么前十位会自动隐藏，只输出十位后面的。

user: user-0
content: 引用 11 楼 liups 的回复:[quote=引用 9 楼 qq_35555558 的回复:] [quote=引用 7 楼 liups 的回复:] printf("output 4:%x, %x\n", name_p,name_p2); 加这句，观察结果    出来是字母加数字的结合。。。说明了什么[/quote]  %x是以16进制输出，也就是分别输出name和name2的地址，你不会不知道吧？！[/quote]    。。。。。 我现在的水平就是个hello world

user: user-2
content: 引用 9 楼 qq_35555558 的回复:[quote=引用 7 楼 liups 的回复:] printf("output 4:%x, %x\n", name_p,name_p2); 加这句，观察结果    出来是字母加数字的结合。。。说明了什么[/quote]  %x是以16进制输出，也就是分别输出name和name2的地址，你不会不知道吧？！

user: user-2
content: 让你观察地址的输出！  如果你运气好，name后面可能有空置没有用到的内存空间，比如6个字节共16个字节，然后才是name2  那么这个越界实际上并没有造成严重的后果，因为你这里只需要13个字节

user: user-0
content: 引用 7 楼 liups 的回复:printf("output 4:%x, %x\n", name_p,name_p2); 加这句，观察结果    出来是字母加数字的结合。。。说明了什么

user: user-3
content: 数组越界...没事别做这么危险的事

user: user-2
content: http://www.cnblogs.com/hanyulcf/archive/2010/05/24/1742781.html  对齐

user: user-2
content: printf("output 4:%x, %x\n", name_p,name_p2); 加这句，观察结果

user: user-0
content: 引用 3 楼 liups 的回复:[quote=引用 1 楼 liups 的回复:] 又来了。 数组越界啊  重点是name和name2是不是紧挨或连续，这个可没有规定，也可能是name后面是letters，然后才是name2  总之，取决于编译器如何实现  从编译优化的角度看，有较大可能是这样的： name为10个char 后面为了对齐（为了速度）可能会空几个，然后再是name2  而对齐通常是和编译器的位数有关，比如32位的，通常是4的倍数，所以空2个字节，而64位的则空6个字节[/quote]   不太明白对齐是什么意思。。。 当我输出位数小于10的时候，是全部输出，位数大于10，自动忽略掉前十位，只输出十位后面的。按你这个说法，电脑是64位的话，应该空6个字节，为什么是10个呢

user: user-2
content: 引用 2 楼 qq_35555558 的回复:[quote=引用 1 楼 liups 的回复:] 又来了。 数组越界啊  重点是name和name2是不是紧挨或连续，这个可没有规定，也可能是name后面是letters，然后才是name2  总之，取决于编译器如何实现   老师一定让做出来。。。他说跟分配内存有关系。。。我实在不知道咋做。。。 什么叫name后面是letters 然后才是name2.。。[/quote]  如果老师让你观察，我可以理解。做出来？不明白

user: user-2
content: 引用 2 楼 qq_35555558 的回复:[quote=引用 1 楼 liups 的回复:] 又来了。 数组越界啊  重点是name和name2是不是紧挨或连续，这个可没有规定，也可能是name后面是letters，然后才是name2  总之，取决于编译器如何实现   老师一定让做出来。。。他说跟分配内存有关系。。。我实在不知道咋做。。。 什么叫name后面是letters 然后才是name2.。。[/quote]  输出name和name2的地址观察一下吧（通过调试也可以观察）

user: user-2
content: 引用 1 楼 liups 的回复:又来了。 数组越界啊  重点是name和name2是不是紧挨或连续，这个可没有规定，也可能是name后面是letters，然后才是name2  总之，取决于编译器如何实现  从编译优化的角度看，有较大可能是这样的： name为10个char 后面为了对齐（为了速度）可能会空几个，然后再是name2  而对齐通常是和编译器的位数有关，比如32位的，通常是4的倍数，所以空2个字节，而64位的则空6个字节

user: user-0
content: 引用 1 楼 liups 的回复:又来了。 数组越界啊  重点是name和name2是不是紧挨或连续，这个可没有规定，也可能是name后面是letters，然后才是name2  总之，取决于编译器如何实现   老师一定让做出来。。。他说跟分配内存有关系。。。我实在不知道咋做。。。 什么叫name后面是letters 然后才是name2.。。

user: user-2
content: 又来了。 数组越界啊  重点是name和name2是不是紧挨或连续，这个可没有规定，也可能是name后面是letters，然后才是name2  总之，取决于编译器如何实现