我在理解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(¶m1_ptr, ¶m2_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中那样做?
答案 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]
的内存位置,以便¶m1_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风格的编码。