一些C语言运行的问题

一些c语言基础知识,运行之后结果不理解。

  1. void main()
    {
         int a[5];
         int i;
         int *p[5];
                                                 
         for(i = 0; i < 5; i++)
         {
                 int b[5] = {1,2,3,4,5};
                 p[i] = &b[i];
                 printf("p is %d\n",*p[i]);
         }
         memset(a,0,sizeof(a));
         for(i=0;i<5;i++)
         {
                 printf("p[%d] is %d\n",i,*p[i]);
         }
    }
    
    结果:
    p is 1
    p is 2
    p is 3
    p is 4
    p is 5
    p[0] is 0
    p[1] is 0
    p[2] is 0
    p[3] is 0
    p[4] is 0
    
    为什么memset a,结果p也变成0了?
    将memset注释掉,后面打印的就是
    p[0] is 1
    p[1] is 2
    p[2] is 3
    p[3] is 4
    p[4] is 5
    

2.

void func(char *num)
{
        *num = 10; 
}

int main(int argc, char *argv[])
{
        int inc=0;                                                              
        func((char*)&inc);
        printf("inc is %d\n", inc);
        return 0;
}

运行结果
inc is 32522
为什么不初始化inc, 结果会变成32522. 如果说因为没初始化不知道数值是多少,后面func操作不是赋值了吗?
如果初始化inc = 0, 打印出来的就是10了

1.跟你memset没有关系,你去掉也一样
因为b是在循环里定义的,出了循环,它就释放了,p就指向一个随机内存了
2.c语言不检查变量是否初始化
int inc会给它分配一个内存,如果你不把它赋值成0,那么这内存里的值不知道是之前运行什么程序时留下来的,大体可以看做是个随机数

我的运行和你的不一样,a和*p都没关系

img

他的地址变成10了 32522是地址10的值
不出所料 你每次运行也不一样

p[0]到p[5]的值是不会变的,你自己再跑一次试试,a的值改与p是不相关的
第二个因为inc并没有初始值,所以他的值是不确定的,什么都有可能,如果你连续几次运行结果都 一样只能说那块内存刚好没被用到,被你的程序反复使用。

第一个问题 你把 int b[5] = {1,2,3,4,5};放到for循环上面定义。这样测试看看 会不会还是0。
之所以按照你的方式运行出来的结果为0,是因为b的生命周期只在for循环之内,虽然你把b的每个元素的地址赋值给了P,
但是p所指向的空间为栈空间,当for循环执行完之后,数组b已经失效,失效后的栈空间值是不可预期的。所以你那边后面打印出来的是0。而在其他计算机可能是
随机值。

第二个问题:
func((char)&inc);这里调用错误, 改为func((char *)&inc);