数组指针问题。。。。。。。

目的是通过函数改变数组指针的指向进而在主函数输出改变后的值

#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