【问题标题】: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 星,看看是否能解决问题。

标签: c++ c cppcheck


【解决方案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等等..

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 2023-03-30
    • 2019-05-11
    • 1970-01-01
    • 2016-04-15
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多