user-0 提问: C语言数组下标问题

回复:
user: user-1
content: a[0]=abcd a[1]=abcd a[0]=abcdabcdabcd 最后a[0]=abcdabcdabcd 是因为你定义的a[3][4]只有4个位置，abcd占了四个位置后，\n就没有位置了！所以最后读出来的a[0]=abcdabcdabcd 因为\n字符已经被覆盖了。我擦，果断比Python坑！

user: user-2
content: To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints.   Click the Data tab of the Breakpoints dialog box.   In the Expression text box, type the name of the variable.   Click OK to set the breakpoint.

user: user-3
content: 楼主原先给的程序，编译都过不了。所以还是不要乱凑回答了。#6楼的程序连数据类型都改掉了。所以给出的“回答”都不是针对同一个问题。

user: user-4
content: 引用 11 楼 u013171165 的回复:[quote=引用 10 楼 oYinGui1 的回复:] [quote=引用 6 楼 u013171165 的回复:] 求不要误导别人，我亲测，楼主给的问题里面没有错误，确实是代码运行就是那样。 我来解答下： 首先count在sprintf(a[count],"abcd");之后归为0，毫无疑问，而且是i=2之后！一会我贴我的代码运行结果！ 为什么会归为0呢？ 我C很久没玩了！以下解释：执行sprintf(a[count],"abcd");语句时，当count=2，赋值是成功的！楼主可以最后打印a[2]看一看就知道了,但是count立马变为0,我猜是因为2已经是数组a的最后界了，自动做了内存管理，把count变为0了。 如果是这样，我把count定义为全局变量呢？果断的，没有出现楼主给的那种结果，我贴出我的代码，我是用C++写的。 #include <stdio.h> extern int count = 0;  int main() {     char a[4][4];      for(int i=0; i<5; i++)     {             printf("i = %d, count = %d\n", i, count); 	    sprintf(a[count], "1234"); 	    //printf("Yes:a[3] = %s\n", a[3]); 	    printf("HERE: i = %d, count = %d\n", i, count); 	    printf("a[%d] = %s\n", count, a[count]); 	    count++;     }     return 0; } 结果为： i = 0, count = 0 HERE: i = 0, count = 0 a[0] = 1234 i = 1, count = 1 HERE: i = 1, count = 1 a[1] = 1234 i = 2, count = 2 HERE: i = 2, count = 2 a[2] = 1234 i = 3, count = 3 HERE: i = 0, count = 3 a[3] = 1234 i = 1, count = 4 HERE: i = 875770417, count = 4 a[4] = 1234  由最后的 i = 875770417可以看得出，这绝对坑啊！我猜是内存管理的原因。 最后，希望回答问题的负责任！！！ 1.数组越界不会有什么自动的处理方案; 2.4个元素的字符数组，你直接写4个字符进去，不打算给'\0'留位置了？ 3.你明知道数组一维只有4个元素，你还执行5次？[/quote] 对于2，很久没用C了，都忘了，最近开始重修 对于3，这是故意的，我做测试 问：为什么会出现这种问题，以及怎么解决？[/quote]  #include <stdio.h> extern int count = 0;  int main() {     char a[4][4];      for(volatile int i=0; i<5; i++)     {         printf("i = %d, count = %d\n", i, count);         sprintf(a[count], "%d", 123);         //printf("Yes:a[3] = %s\n", a[3]);         printf("HERE: i = %d, count = %d\n", i, count);         printf("a[%d] = %s\n", count, a[count]);         count++;     }     return 0; }  i的声明加volatile，拒绝编译器的优化。

user: user-1
content: 引用 10 楼 oYinGui1 的回复:[quote=引用 6 楼 u013171165 的回复:] 求不要误导别人，我亲测，楼主给的问题里面没有错误，确实是代码运行就是那样。 我来解答下： 首先count在sprintf(a[count],"abcd");之后归为0，毫无疑问，而且是i=2之后！一会我贴我的代码运行结果！ 为什么会归为0呢？ 我C很久没玩了！以下解释：执行sprintf(a[count],"abcd");语句时，当count=2，赋值是成功的！楼主可以最后打印a[2]看一看就知道了,但是count立马变为0,我猜是因为2已经是数组a的最后界了，自动做了内存管理，把count变为0了。 如果是这样，我把count定义为全局变量呢？果断的，没有出现楼主给的那种结果，我贴出我的代码，我是用C++写的。 #include <stdio.h> extern int count = 0;  int main() {     char a[4][4];      for(int i=0; i<5; i++)     {             printf("i = %d, count = %d\n", i, count); 	    sprintf(a[count], "1234"); 	    //printf("Yes:a[3] = %s\n", a[3]); 	    printf("HERE: i = %d, count = %d\n", i, count); 	    printf("a[%d] = %s\n", count, a[count]); 	    count++;     }     return 0; } 结果为： i = 0, count = 0 HERE: i = 0, count = 0 a[0] = 1234 i = 1, count = 1 HERE: i = 1, count = 1 a[1] = 1234 i = 2, count = 2 HERE: i = 2, count = 2 a[2] = 1234 i = 3, count = 3 HERE: i = 0, count = 3 a[3] = 1234 i = 1, count = 4 HERE: i = 875770417, count = 4 a[4] = 1234  由最后的 i = 875770417可以看得出，这绝对坑啊！我猜是内存管理的原因。 最后，希望回答问题的负责任！！！ 1.数组越界不会有什么自动的处理方案; 2.4个元素的字符数组，你直接写4个字符进去，不打算给'\0'留位置了？ 3.你明知道数组一维只有4个元素，你还执行5次？[/quote] 对于2，很久没用C了，都忘了，最近开始重修 对于3，这是故意的，我做测试 问：为什么会出现这种问题，以及怎么解决？

user: user-4
content: 引用 6 楼 u013171165 的回复:求不要误导别人，我亲测，楼主给的问题里面没有错误，确实是代码运行就是那样。 我来解答下： 首先count在sprintf(a[count],"abcd");之后归为0，毫无疑问，而且是i=2之后！一会我贴我的代码运行结果！ 为什么会归为0呢？ 我C很久没玩了！以下解释：执行sprintf(a[count],"abcd");语句时，当count=2，赋值是成功的！楼主可以最后打印a[2]看一看就知道了,但是count立马变为0,我猜是因为2已经是数组a的最后界了，自动做了内存管理，把count变为0了。 如果是这样，我把count定义为全局变量呢？果断的，没有出现楼主给的那种结果，我贴出我的代码，我是用C++写的。 #include <stdio.h> extern int count = 0;  int main() {     char a[4][4];      for(int i=0; i<5; i++)     {             printf("i = %d, count = %d\n", i, count); 	    sprintf(a[count], "1234"); 	    //printf("Yes:a[3] = %s\n", a[3]); 	    printf("HERE: i = %d, count = %d\n", i, count); 	    printf("a[%d] = %s\n", count, a[count]); 	    count++;     }     return 0; } 结果为： i = 0, count = 0 HERE: i = 0, count = 0 a[0] = 1234 i = 1, count = 1 HERE: i = 1, count = 1 a[1] = 1234 i = 2, count = 2 HERE: i = 2, count = 2 a[2] = 1234 i = 3, count = 3 HERE: i = 0, count = 3 a[3] = 1234 i = 1, count = 4 HERE: i = 875770417, count = 4 a[4] = 1234  由最后的 i = 875770417可以看得出，这绝对坑啊！我猜是内存管理的原因。 最后，希望回答问题的负责任！！！ 1.数组越界不会有什么自动的处理方案; 2.4个元素的字符数组，你直接写4个字符进去，不打算给'\0'留位置了？ 3.你明知道数组一维只有4个元素，你还执行5次？

user: user-5
content: a[0] = abcd a[1] = abcd a[2] = abcd   为什么我运行的结果是这个呢。linux  gcc

user: user-6
content: 把内存分布图画出来就知道为什么了呗，而且定义的数组长度比输入的字符串要长1个字节，用来存储'\0'

user: user-1
content: 难道C++内存溢出这么严重么？那不得小心小心再小心，C/C++我很水，请大神解答。

user: user-1
content: 求不要误导别人，我亲测，楼主给的问题里面没有错误，确实是代码运行就是那样。 我来解答下： 首先count在sprintf(a[count],"abcd");之后归为0，毫无疑问，而且是i=2之后！一会我贴我的代码运行结果！ 为什么会归为0呢？ 我C很久没玩了！以下解释：执行sprintf(a[count],"abcd");语句时，当count=2，赋值是成功的！楼主可以最后打印a[2]看一看就知道了,但是count立马变为0,我猜是因为2已经是数组a的最后界了，自动做了内存管理，把count变为0了。 如果是这样，我把count定义为全局变量呢？果断的，没有出现楼主给的那种结果，我贴出我的代码，我是用C++写的。 #include <stdio.h> extern int count = 0;  int main() {     char a[4][4];      for(int i=0; i<5; i++)     {             printf("i = %d, count = %d\n", i, count); 	    sprintf(a[count], "1234"); 	    //printf("Yes:a[3] = %s\n", a[3]); 	    printf("HERE: i = %d, count = %d\n", i, count); 	    printf("a[%d] = %s\n", count, a[count]); 	    count++;     }     return 0; } 结果为： i = 0, count = 0 HERE: i = 0, count = 0 a[0] = 1234 i = 1, count = 1 HERE: i = 1, count = 1 a[1] = 1234 i = 2, count = 2 HERE: i = 2, count = 2 a[2] = 1234 i = 3, count = 3 HERE: i = 0, count = 3 a[3] = 1234 i = 1, count = 4 HERE: i = 875770417, count = 4 a[4] = 1234  由最后的 i = 875770417可以看得出，这绝对坑啊！我猜是内存管理的原因。 最后，希望回答问题的负责任！！！

user: user-7
content: 引用 2 楼 user-9 的回复:int a[3][5]; 否则最后的\0没地方放没用 楼主是向 int [3][5]写入数据 不是char a[3][5] 单纯就内存大小而言 完全足够  问题是楼主显然不知道他在干什么

user: user-8
content: 你把完整的代码贴出来， 现在的肯定不会这样的 a[0]=abcd a[1]=abcd a[0]=abcdabcdabcd

user: user-1
content: 数组下标应为常量，但是for循环中的i为什么可以作为数组小标 关于这个问题，首先，数组下标在C中只要为int行数据就可，当然得在界面，不是说要为常量； for循环中，每次循环中，i的值只有1个，而且你定义的i就是int型数据啊！

user: user-9
content: int a[3][5]; 否则最后的\0没地方放

user: user-9
content: 数组下标应为常量,这是在定义时，不是使用时