注册 登录
编程论坛 C语言论坛

为什么 s[ i ] 这个没有定义的数组,最后能输出 9198

风过无痕1989 发布于 2020-12-02 13:36, 2231 次点击
被人问倒这么一个问题,我用 VS2015 步进运行了很多次,发现这个没有定义的数组,在循环到 i = 1 时,被成功赋值 9198,并成功地最终输出
程序代码:

#include<stdio.h>
int main()
{
        int i,c;
        char s[2][5]={"8980","9198"};
        for(i=3;i>=0;i--)            
        {
                c=s[0][i]+s[1][i]-2*'0';
                s[0][i]=c%10+'\0';
        }
        for(i=0;i<=1;i++)
        puts(s[i]);
        return 0;
}
8 回复
#2
纯蓝之刃2020-12-02 13:48
你输出的是地址。s[i]和&s[i][0]是一样的,是指向第i行第一个元素的指针地址
#3
apull2020-12-02 14:01
s[i]不是定义了么,字符串数组
等价于
char s[2][5];
strcpy(s[0], "8980");
strcpy(s[1], "9198");

s[i]指一个字符串,s[i][j]指字符串s[i]中的第j个字符。

代码中一直在操作字符串s[0],字符串s[1]一直没动过。
#4
请输入密码2020-12-02 14:20
s[0][i]=c%10+'\0';

s[0][i]=c%10+'0';


这是……
#5
风过无痕19892020-12-02 14:30
回复 2楼 纯蓝之刃
明白了,谢谢!
#6
风过无痕19892020-12-02 14:31
回复 3楼 apull
s[i] 是地址,也算是隐形定义了哈,清楚了,谢谢!
#7
风过无痕19892020-12-02 14:33
回复 4楼 请输入密码
怎么啦?
#8
请输入密码2020-12-02 14:51
回复 7楼 风过无痕1989
只是好奇这个程序+'\0'的意思在哪里而已。
正常来说是'0'而不是'\0';
#9
风过无痕19892020-12-02 15:38
回复 8楼 请输入密码
经上面两位大佬的指导,我在原程序的末尾加了一个 s[2][5] 的输出,一看就完全明白了:
程序代码:

#include<stdio.h>
int main()
{
    int i, j, c;
    char s[2][5] = { "8980","9198" };

    for (i = 3;i >= 0;i--)
    {
        c = s[0][i] + s[1][i] - 2 * '0';
        s[0][i] = c % 10 + '\0';
    }
    for (i = 0;i <= 1;i++)
    {
        puts(s[i]);
    }
    printf("\n");
   
    for (i = 0;i < 2;i++)             // 输出 s[2][5] 数组
    {
        for (j = 0;j < 4;j++)
        {
            printf("%.2d ", s[i][j]);
        }
        printf("\n");
    }
    return 0;
}

**************************************************************
9198

07 00 07 08
57 49 57 56          <- - - - - -     9 0 9 8 的 ASCII码
Press any key to continue . . .
1