C语言数组下标问题

WB8933 2014-06-20 09:24:07
数组下标应为常量,但是for循环中的i为什么可以作为数组小标
另外,如下程序段:
int a[3][4];
for(i=0;i<3;i++)
{
sprintf(a[i],"abcd");
printf("a[%d] = %s\n", i, a[i]);
}
正常输出:
a[0]=abcd
a[1]=abcd
a[2]=abcd
但是为什么
int a[3][4];
int count;
for(i=0,count=0;i<3;i++)
{
sprintf(a[count],"abcd");
printf("a[%d] = %s\n", count, a[count]);
count++;
}
输出的却是:
a[0]=abcd
a[1]=abcd
a[0]=abcdabcdabcd
...全文
443 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
The_Third_Wave 2014-06-21
  • 打赏
  • 举报
回复
a[0]=abcd a[1]=abcd a[0]=abcdabcdabcd 最后a[0]=abcdabcdabcd 是因为你定义的a[3][4]只有4个位置,abcd占了四个位置后,\n就没有位置了!所以最后读出来的a[0]=abcdabcdabcd 因为\n字符已经被覆盖了。我擦,果断比Python坑!
赵4老师 2014-06-20
  • 打赏
  • 举报
回复
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.
unituniverse2 2014-06-20
  • 打赏
  • 举报
回复
楼主原先给的程序,编译都过不了。所以还是不要乱凑回答了。#6楼的程序连数据类型都改掉了。所以给出的“回答”都不是针对同一个问题。
Morrisss_ 2014-06-20
  • 打赏
  • 举报
回复
引用 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,拒绝编译器的优化。
The_Third_Wave 2014-06-20
  • 打赏
  • 举报
回复
引用 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,这是故意的,我做测试 问:为什么会出现这种问题,以及怎么解决?
Morrisss_ 2014-06-20
  • 打赏
  • 举报
回复
引用 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次?
Mortred_cp 2014-06-20
  • 打赏
  • 举报
回复
a[0] = abcd a[1] = abcd a[2] = abcd 为什么我运行的结果是这个呢。linux gcc
707wk 2014-06-20
  • 打赏
  • 举报
回复
把内存分布图画出来就知道为什么了呗,而且定义的数组长度比输入的字符串要长1个字节,用来存储'\0'
The_Third_Wave 2014-06-20
  • 打赏
  • 举报
回复
难道C++内存溢出这么严重么?那不得小心小心再小心,C/C++我很水,请大神解答。
The_Third_Wave 2014-06-20
  • 打赏
  • 举报
回复
求不要误导别人,我亲测,楼主给的问题里面没有错误,确实是代码运行就是那样。 我来解答下: 首先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可以看得出,这绝对坑啊!我猜是内存管理的原因。 最后,希望回答问题的负责任!!!
lin5161678 2014-06-20
  • 打赏
  • 举报
回复
引用 2 楼 buyong 的回复:
int a[3][5]; 否则最后的\0没地方放
没用 楼主是向 int [3][5]写入数据 不是char a[3][5] 单纯就内存大小而言 完全足够 问题是楼主显然不知道他在干什么
merlinfang 2014-06-20
  • 打赏
  • 举报
回复
你把完整的代码贴出来, 现在的肯定不会这样的 a[0]=abcd a[1]=abcd a[0]=abcdabcdabcd
The_Third_Wave 2014-06-20
  • 打赏
  • 举报
回复
数组下标应为常量,但是for循环中的i为什么可以作为数组小标 关于这个问题,首先,数组下标在C中只要为int行数据就可,当然得在界面,不是说要为常量; for循环中,每次循环中,i的值只有1个,而且你定义的i就是int型数据啊!
buyong 2014-06-20
  • 打赏
  • 举报
回复
int a[3][5]; 否则最后的\0没地方放
buyong 2014-06-20
  • 打赏
  • 举报
回复
数组下标应为常量,这是在定义时,不是使用时

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧