如何将char array []传递给接受const char* arg
类型的函数,以及最合适的方法是什么?
请忽略我在此示例中使用静态100缓冲区的事实:
char buff[100];
sprintf_s(buff, sizeof(buff), "%s", unrelated);
然后我需要将buff
传递给接受const char*
MyFunction(const char* path);
我尝试直接传递它:MyFunction(buff)
并且它有效,但有人可能会为什么?如果有更好的方法来达到同样的结果呢?
答案 0 :(得分:0)
我尝试直接传递它:
MyFunction(buff)
并且它有效,但有人可能会为什么?如果有更好的方法来达到同样的结果呢?
“更好的方式”可以解释很多。 SO的一些人坚持认为std::string
是C ++方式,因此总是比char[]
更好,但事实是它取决于你正在做什么。如果你试图避免动态内存分配,那么你所拥有的当然是可以接受的,甚至可能是“最佳方式”。但是,如果你为缓冲区数组动态分配内存,即const char* buff = new char[BUFF_SIZE];
,那么我认为“更好的方法”是使用std::string
,原因很多,其中最重要的是它管理自己的记忆。在你的情况下,你可以像这样使用它。
std::string buff;
MyFunction(buff.c_str());
为什么将char []传递给const char *工作?
它的工作原理是因为在表达式中使用时,数组名称会衰减成指向第一个元素的指针。在您的示例中,char buff[100]
在传递到char*
时会衰减到指针MyFunction
。您还可以将非const参数作为const
传递,因为MyFunction
保证不会改变数据。这种对const
的隐式转换很好并且允许。
正确终止的const char*
是“特殊的”,并且最后会有\0
sentinel value,因此您无需指定传递给函数的缓冲区的大小你会使用所有其他类型的数组。被调用的函数将检查此null终止符并以适当的长度停止而不会超出范围。我假设您的MyFunction(const char* path);
以这种方式检查正确的空终止C字符串,如果没有,那么它必须对path
进行一些潜在的危险假设。
答案 1 :(得分:0)
函数签名可以重写为:
int MyFunction(char const * buff);
从右到左读取类型,该函数需要一个指向char
的常量缓冲区(只读)的指针。该函数很有希望它不会改变buff
的内容。
您可以传递可变缓冲区(非const),因为该函数不会修改缓冲区。这是允许的。
您不能将指向常量(只读)缓冲区的指针传递给将修改缓冲区的函数。
int MutateBuffer(char * buffer);
以上是可能写入缓冲区的函数的签名。因此,不建议将只读缓冲区传递给此函数,编译器至少会对此进行警告。
答案 2 :(得分:0)
数组"decays" into a pointer到同一个内存。只要数组中的数据末尾有一个标记(NUL字节),被调用者只需要指针,并且可以使用缓冲区直到标记。
或者,如果它不是C字符串(即没有哨兵;哨兵是使数组成为C字符串的惯例),那么你也需要通过缓冲区的长度(通常为sizeof(buff)
),因此被调用者知道缓冲区的长度 - 以避免超出缓冲区。