一些c语言基础知识,运行之后结果不理解。
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了?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都没关系
他的地址变成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);