带有char **参数的C ++函数

时间:2016-09-08 14:07:41

标签: c++ arrays pointers char

我在理解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中那样做?

2 个答案:

答案 0 :(得分:3)

  

我想

     

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_ptr分配到param1_val[0]的内存位置,以便&param1_val[0]

char *param1_array[20];

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

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

答案 1 :(得分:2)

GetInfo声明为char**的函数的可能原因是它输出 a 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风格的编码。