【问题标题】:C++ function with char** parameter带有 char** 参数的 C++ 函数
【发布时间】:2016-09-08 14:07:40
【问题描述】:

我在理解 char 指针方面有一些问题。 假设有以下方法声明(对不起,我没有方法的实现,希望足以解释我的问题):

short GetInfo(char **param1, char **param2);

我试着用两种不同的方式来称呼它:

// 1. When I call it this way it works
char param1_val[20];
char *param1_ptr = param1_val;

char param2_val[20];
char *param2_ptr = param2_val;

GetInfo(&param1_ptr, &param2_ptr);

// 2. When I call it that way I get an 'access violation exception'
char *param1_array[20];
char *param2_array[20];

GetInfo(param1_array, param2_array);

我以为

char param1_val[20];
char *param1_ptr = param1_val;

相同
char *param1_array[20];

但似乎它们是不同的。 有没有办法让我的第二个案例工作?还是我把事情搞混了,我必须像案例 1 那样做?

【问题讨论】:

  • 指针很痛苦,指向指针的指针加倍。这是非常自找的。也就是说,您应该知道什么是数组、什么是指针以及它们之间的关系。
  • @MSalters:这是一个我不能再问的人编写的给定界面。我知道指针很痛苦,尤其是对于 C++ 的新手而言。这就是我在 SO 的原因。

标签: c++ arrays pointers char


【解决方案1】:

我想

char param1_val[20];

char *param1_ptr = param1_val;

相同

char *param1_array[20];

它们不一样。

char param1_val[20];
char *param1_ptr = param1_val;

声明一个包含 20 个字符的数组 param1_val 并声明并分配 param1_ptrparam1_val[0] 的内存位置,所以 &param1_val[0]

char *param1_array[20];

声明一个包含 20 个字符指针 param1_array 的数组,它们仍然都指向垃圾位置。

我假设 GetInfo 正在取消引用您的 param1_array 中的指针,这会导致访问冲突,因为尝试从随机内存地址读取不是您想要做的事情。

【讨论】:

    【解决方案2】:

    GetInfo 声明为采用char** 的函数的可能原因是它输出一个char*,因此它可能会更像这样使用:

    //short GetInfo(char **param1, char **param2);
    char *ptr1=nullptr;
    char *ptr2=nullptr;
    GetInfo(&ptr1,&ptr2);
    if(ptr1)    
        std::cout<<*ptr1<<std::endl; 
    //etc
    

    要真正理解指针和数组,请查找有关该主题的 C 文档。在 C++ 中,它们与 C 向后兼容。但是,在 C++ 中,最好在更高级别上工作,例如使用 STL 而不是 C 风格的编码。

    【讨论】:

    • 感谢您的链接。我会看看。我同意你的观点,该方法想要返回一个char*。但是如果我用nullptr初始化参数,在方法调用之后它们仍然是空的。
    • 也许它毕竟不想输出指针。可能只是一个不必要的间接。
    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 2014-06-29
    • 2013-03-10
    • 2015-01-16
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多