小白求解为什么我这一段C语言代码**p无法输出???

include

void f(int ** q);
int main()
{
int * p;
f(&p);
return 0;
}
void f(int ** q)
{
q=8;
printf("%d",
q);
}

c

9个回答

有输出值8;如果把printf放在main函数中就不会有输出值或乱码。

sinat_40258777
Je11yBean 代码打错了啊,是下面的 # include <stdio.h> void f(int ** q); int main() { int * p; f(&p); return 0; } void f(int ** q) { **q=8; printf("%d",**q); }
2 年多之前 回复
sinat_40258777
Je11yBean 跟printf没有关系啊,**p不能直接赋值输出,要添加malloc函数,我只想知道为什么,加了malloc函数就能输出
2 年多之前 回复

这里的q 是被调函数在调用时开辟的一段空间,名称为q,是个二级指针,指向一级指针,你把原来一级指针的地址给了这个q,再使q里面的值为 8;
这样写不合法, 如果是赋值的话,得这么写,** q = 8;
而上述的写法也有很大的缺陷。 由于你的main函数里定义的p是个野指针,p里面存的地址指向不知道的区域,所以这样会非法改动系统没有给你的内存,
可能会报 段错误;最好的写法是:
在main中:
int num;
int *p =NULL;
p = &num;
f(&p);

在void f()中:

q = 8;
printf("%d\n",
q);

这里你有很多错误,q存的是p的地址,如果要打印的话 应该用格式控制符 %p
而不是 %d 而且 比较重要的一点是 %d后面没有加 \n

这里一定要注意:缓冲区的问题;
printf()  函数  默认打开的缓冲区 是 stdout  ,你往屏幕上打印的东西,是先存在这个缓冲区里,等待  \n 或者缓冲区满了,再或者程序结束,
才会打印输出,你这里不加虽然说程序结束也会打印出来,大师如果有下面这个例子:

#include<stdio.h>

#include
int main(int argc, char **argv)
{
printf("hello");
memset(stdout,0,sizeof(stdout)); //清空缓冲区
return 0;
}

如果这样写,那么屏幕上不会有hello
因为你的hello在stdout中 之后又清空了缓冲区
那么程序结束后 缓冲区里就没有任何东西
所以加上 \n 比较稳妥

qq_40084389
荒野逃跑 你好 我这边想要找你做一个工具包 工具中加上我的两条代码 ,一条是推送一条是极光推送消息如果能做的话我这边发 我这边有微信和QQ你看用什么最方便联系我 价格你报一下多少能给我做 QQ2639823221 微信 D814619026
2 年多之前 回复
sinat_40258777
Je11yBean 谢谢啊,发的问题代码有误,其实想问下面代码的 # include <stdio.h> void f(int ** q); int main() { int * p; f(&p); return 0; } void f(int ** q) { **q=8; printf("%d",**q); }
2 年多之前 回复
DRJsportman
DRJsportman q 前面+ **
2 年多之前 回复

printf 没加 \n

8是int 这个q是指针的指针 也就是int** 俩个完全不搭怎么赋值
把这句注掉可以输出这个变量的地址 不知道你想输出什么 也不知道你想验证什么

qq_38204686
das白 回复sinat_40258777: 指针本身所占空间与其指向空间是不同的 应该让其指向一个内存
2 年多之前 回复
sinat_40258777
Je11yBean 在定义*p这个指针时,系统不已经为*p开辟空间了吗?
2 年多之前 回复
qq_38204686
das白 回复sinat_40258777: 是啊 开辟控件就可以赋值了
2 年多之前 回复
sinat_40258777
Je11yBean 是不是用malloc为*p开辟空间就行了?
2 年多之前 回复
qq_38204686
das白 回复sinat_40258777: 你这个指针指向空 不指向任何内存 无法赋值的
2 年多之前 回复
sinat_40258777
Je11yBean 不好意思啊,代码打错了,帮忙看一下,是下面的 # include <stdio.h> void f(int ** q); int main() { int * p; f(&p); return 0; } void f(int ** q) { **q=8; printf("%d",**q); }
2 年多之前 回复

代码打错了,是下面的

include

void f(int ** q);
int main()
{
int * p;
f(&p);
return 0;
}
void f(int ** q)
{
q=8;
printf("%d",
q);
}

sinat_40258777
Je11yBean 又错了,不知道为什么,**老实被论坛不显示,是**q=8,然后输出**q
2 年多之前 回复

你后面改过的那个代码,还不能输出吗???
= =为什么我这有输出

sinat_40258777
Je11yBean 你试试 # include <stdio.h> void f(int ** q); int main() { int * p; f(&p); return 0; } void f(int ** q) { **q=8; printf("%d",**q); }
2 年多之前 回复

图片说明
如图,好好的输出了= =

楼上正解,你把q指针改变了,指向就变了。
一个一级指针能解决的战斗,为啥写俩,这么写,图啥?

u012889441
JennyReborn 回复sinat_40258777: 因为你在main函数里只是声明了*p,而*p是个空指针不指向任何值。而你在**q=8的时候,他并不知道该把这个值赋给谁。
2 年多之前 回复
sinat_40258777
Je11yBean 谢谢啊,发的问题中代码有误,其实想问下面的 # include <stdio.h> void f(int ** q); int main() { int * p; f(&p); return 0; } void f(int ** q) { **q=8; printf("%d",**q); }
2 年多之前 回复

。。。**q是二级指针,*q是变量地址,改成**q就行了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问