将指向常量的指针作为参数传递时出现问题
Posted
技术标签:
【中文标题】将指向常量的指针作为参数传递时出现问题【英文标题】:Issue while passing pointer to constant as an argument 【发布时间】:2014-09-25 06:29:21 【问题描述】:在此例如,使用按地址调用的概念来检索函数调用中发生的所有数据更改...
在main()
,
i) 传递两个参数 i)int 指针 ii) 指向常量的指针 -> 它不能改变它所持有的值...
ii)在函数调用中更改 int * 的值并为 const void * 分配一些值。
*最后我尝试打印main()
中的值
*正确获取 int 指针值(没问题)
*将 void 指针值设为 NULL..
要求:
需要像这样在main()
中获取输出
main::ajskdffllagkdjdjdhdjhd(我的意思是说我需要像这样打印 void * 值)
但我得到的值是 main:: NULL
我需要做什么才能获得预期的输出?
#include <stdio.h>
#include <stdlib.h>
void func(int *len,const void *pBuf);
void func2(int **len,const void **pBuf);
void func3(int ***len,const void ***pBuf);
int main()
int len = 0;
const void *pBuf;
printf("len b4 ::%d\n",len);
printf("%p\n",&pBuf);
func(&len,&pBuf);
printf("len after::%d\n",len);
printf("%p\n",&pBuf);
printf("main::%s\n",(const char *)pBuf);
return 0;
void func(int *len,const void *pBuf)
*len = 20;
printf("func1 :: %p\n",&pBuf);
func2(&len,&pBuf);
void func2(int **len,const void **pBuf)
printf("func2::%p\n",&pBuf);
**len = 30;
func3(&len,&pBuf);
void func3(int ***len,const void ***pBuf)
const void *pMy = "ajskdffllagkdjdjdhdjhd";
**pBuf = pMy;
printf("func3::%p\n",&pBuf);
printf("func3::%s\n",(const char *)**pBuf);
***len = 40;
Output:
len b4::0
0x7fffa9c51468
func1 :: 0x7fffa9c51440
func2::0x7fffa9c51420
func3::0x7fffa9c513f0
func3::ajskdffllagkdjdjdhdjhd
len after::40
0x7fffa9c51468
main::(null)
【问题讨论】:
你在为国际混淆 C 代码竞赛做准备吗? 更改代码以使用正确类型的指针(char*
而不是 void*
),消除类型转换为 const char*
,编译器会告诉你哪里出错了。
这被称为三星级编程。显然,所有问题的解决方案是添加更多级别的间接性。尝试添加第 4 星,看看是否能解决问题。
【参考方案1】:
你对字符串文字是正确的。对不起。
但是,你需要更改pBuf指向的地址:
void func(int *len,const void **pBuf)
*len = 20;
printf("func1 :: %p\n",pBuf);
func2(&len,&pBuf);
void func2(int **len,const void ***pBuf)
printf("func2::%p\n",pBuf);
**len = 30;
func3(&len,&pBuf);
void func3(int ***len,const void ****pBuf)
const void *pMy = "ajskdffllagkdjdjdhdjhd";
***pBuf = pMy;
printf("func3::%p\n",&pBuf);
printf("func3::%s\n",(const char *)***pBuf);
***len = 40;
len
是一个int
。为了更改它,您需要使用该int
值的地址调用func()
。
pBuf
是一个指针。要更改它指向的地址,您需要使用该指针的地址调用func()
。
【讨论】:
"ajskdffllagkdjdjdhdjhd"
是字符串文字,因此它具有静态存储持续时间和跨越程序生命周期的生命周期。函数返回后继续存在。
我不这么认为。它会在函数返回后可用。
尝试全局声明 const void *(出现同样的问题)...您能解释一下如何将字符串放在堆上吗?
@Jayesh :: 我也有同样的感觉,但我没有得到那样的输出......将输出与代码一起包含......
@Manidhan:将**pBuf = pMy;
更改为*(const void **)(**pBuf) = pMy;
或***(const void ****)pBuf = pMy;
。为什么这些工作留给读者作为练习。【参考方案2】:
您正在使用单指针捕获int
的地址,并且还使用单指针捕获pointer
的地址。这是个问题。在函数中,将*pBuf
更改为**pBuf
,将**pBuf
更改为***pBuf
等等..
【讨论】:
以上是关于将指向常量的指针作为参数传递时出现问题的主要内容,如果未能解决你的问题,请参考以下文章