将指向常量的指针作为参数传递时出现问题

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等等..

【讨论】:

以上是关于将指向常量的指针作为参数传递时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

将字符串引用作为参数传递时出现错误的 Ptr

C - 尝试将指向函数的指针作为参数传递时出错,无法获取值

为啥在将命令行图像文件中的参数作为参数传递时出现错误

如何将指向方法的指针作为另一个方法参数传递

将变量名称作为参数从外部函数传递到 R 中的内部函数时出现问题?

数组名作函数参数时,实参与形参变量之间的数据传递是?