目的是通过函数改变数组指针的指向进而在主函数输出改变后的值
#include<stdio.h>
int main()
{
int a[3] = { 1,2,3 };
int(*q)[3] = &a;
int(**m)[3] = &q;
void fun(int(**)[3]);
fun(&q);
for (int i = 0; i < 3; i++)
printf("%d ",(**m)[i]);
}
void fun(int (**p)[3])
{
int b[3] = { 19,65,9 };
*p = &b;
}
程序输出:19 -858993460 11
请问大家这是哪里出错了
b的作用域只在fun的大括号里,函数结束后b就销毁了,里面都是垃圾信息
int(**m)[3] = &q; 这里用 二维指针用的不对,m[0]指向q(也是a)的首地址也就说m[0]是一个数组,可是m[1]和m[2]你都没初始化,取出来的值当然是奇奇怪怪的。
还有就是函数fun里创建的变量b,它所指向的内存在函数生命周期结束后就会被回收。
#include<stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{
int a[3] = { 1,2,3 };
int(*q)[3] = &a;
int(**m)[3] = &q;
void fun(int(**)[3]);
fun(&q);
for (int i = 0; i < 3; i++)
printf("%d ", *m[i]);
system("pause");
return 0;
}
void fun(int(**p)[3])
{
int b[3] = { 19,65,9 };
//*p = (&b);
memcpy(p, &b, sizeof(b));
}
考虑用memcpy复制数值b的内存,或者使用new int。
最后print那里,用*m[i]
把b声明为static 静态局部变量
static int b[3]
保持变量内容的持久性
#include<stdio.h>
int main()
{
int a = 5, *p = &a;
void func(int **);
func(&p);
printf("%d \n", *p);
return 0;
}
void func(int **s)
{
int b = 100;
*s = &b;
}
那这样说的话b的生命周期离开函数也应该消失啊,但是这却可以输出100
#include<stdio.h>
int main()
{
int a = 5, *p = &a;
void func(int **);
func(&p);
printf("%d \n", *p);
return 0;
}
void func(int **s)
{
int b = 100;
*s = &b;
}
那b的生命周期离开函数也该消失啊,但是却可以正常输出100
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y