如何正确引用作为地址传递给函数的 char** 指针?
How to properly deference a char** pointer passed as an address to functions?
我正在编写一个使用 char ** 设置多维数组的程序。
然后我将 char ** 的地址传递给另一个函数来玩。
在通过地址将指针传递给另一个函数后,如何正确引用 ** 指针?
ERROR
array of c string
Segmentation fault
int test(char *** strings){
puts(*strings[0]);
puts(*strings[1]);
return 1;
}
int main(void) {
char arr[][25] =
{ "array of c string",
"is fun to use",
"make sure to properly",
"tell the array size"
};
char ** strings = (char**)malloc(2 * sizeof(char*));
strings[0] = (char*)malloc(25 * sizeof(char));
strcpy(strings[0], arr[0]);
strings[1] = (char*)malloc(25 * sizeof(char));
strcpy(strings[1], arr[1]);
test(&strings);
return 1;
}
*强制转换 Mallocs 以防有人将其插入 C++ 游乐场
这个有效:
int test(char *** strings){
puts((*strings)[0]);
puts((*strings)[1]);
return 1;
}
因为 []
比 *
绑定更紧密,您需要先取消引用。参见 https://en.cppreference.com/w/c/language/operator_precedence
你可以使用数组表示法,它看起来更好,IMO:
int test(char ***strings){
puts(strings[0][0]);
puts(strings[0][1]);
return 1;
}
假设您想更改角色:
strings[0][1][1] = 'z';
这将更改第二个字符串的第二个字符(索引 1),然后它将是:
iz fun to use
^
如果目标只是访问数据而不是修改数据,按值传递指针就足够了。
通过引用将指针 strings
传递给函数 test
没有什么意义,因为指针本身在函数内没有改变。
而 return 类型 int
也没有意义。
至少可以像
那样声明和定义函数
void test( char ** strings )
{
puts( strings[0] );
puts( strings[1] );
}
并称赞
test( strings );
如果你仍然想通过引用传递指针,那么 puts
的调用可能看起来像
puts( ( *strings )[0] );
puts( ( *strings )[1] );
也就是首先需要解引用指针得到在main
中声明的原始指针strings
,然后对得到的原始指针应用下标运算符,
我正在编写一个使用 char ** 设置多维数组的程序。 然后我将 char ** 的地址传递给另一个函数来玩。
在通过地址将指针传递给另一个函数后,如何正确引用 ** 指针?
ERROR
array of c string
Segmentation fault
int test(char *** strings){
puts(*strings[0]);
puts(*strings[1]);
return 1;
}
int main(void) {
char arr[][25] =
{ "array of c string",
"is fun to use",
"make sure to properly",
"tell the array size"
};
char ** strings = (char**)malloc(2 * sizeof(char*));
strings[0] = (char*)malloc(25 * sizeof(char));
strcpy(strings[0], arr[0]);
strings[1] = (char*)malloc(25 * sizeof(char));
strcpy(strings[1], arr[1]);
test(&strings);
return 1;
}
*强制转换 Mallocs 以防有人将其插入 C++ 游乐场
这个有效:
int test(char *** strings){
puts((*strings)[0]);
puts((*strings)[1]);
return 1;
}
因为 []
比 *
绑定更紧密,您需要先取消引用。参见 https://en.cppreference.com/w/c/language/operator_precedence
你可以使用数组表示法,它看起来更好,IMO:
int test(char ***strings){
puts(strings[0][0]);
puts(strings[0][1]);
return 1;
}
假设您想更改角色:
strings[0][1][1] = 'z';
这将更改第二个字符串的第二个字符(索引 1),然后它将是:
iz fun to use
^
如果目标只是访问数据而不是修改数据,按值传递指针就足够了。
通过引用将指针 strings
传递给函数 test
没有什么意义,因为指针本身在函数内没有改变。
而 return 类型 int
也没有意义。
至少可以像
那样声明和定义函数void test( char ** strings )
{
puts( strings[0] );
puts( strings[1] );
}
并称赞
test( strings );
如果你仍然想通过引用传递指针,那么 puts
的调用可能看起来像
puts( ( *strings )[0] );
puts( ( *strings )[1] );
也就是首先需要解引用指针得到在main
中声明的原始指针strings
,然后对得到的原始指针应用下标运算符,