为什么传递给FUNCTION的char*总是带有字符串的len

why char* passed to FUNCTION always with the len of the string

本文关键字:len 字符串 char FUNCTION 为什么      更新时间:2023-10-16

我最近正在学习c/c++。但我不明白之间的区别

int a(chat* str,int len)
{
cout<<str<<len;
}

int a(char* str)
{
cout<<str<<strlen(str);
}

当您传递没有长度的char*时,您如何知道要处理多少个元素?char*表示指向字符的指针。当您传递指针时,您不知道(也无法发现)为该指针分配了多少内存(如果有的话)。

这就是为什么使用的C字符串以null结尾(它们以''字符结尾),因此您可以通过迭代指针来检测它们的长度。因此,如果你想在不给出其分配内存长度的情况下使用指针,你需要遵守一些约定。但通常情况下,例如,在传递缓冲区时,您不应该期望有任何结束信号字符,因此在这种情况下,您需要传递长度,否则可能会导致读/写越界。

对于您的特定示例,只要您只在C字符串上使用函数,就可以只传递指针,因为strlen(str)使用这种计数约定,直到遇到''

缓冲区溢出是最混乱、最可怕的编程错误之一,可能会导致严重的安全问题。这就是为什么您应该尝试(尽可能)使用C++标准库中的std::string,而不是C样式的char*字符串。

C字符串应该始终包含一个终止字符,我们称之为null字符。从技术上讲,它是0(不是数字0,而是ASCII0)

当我们创建一个char*并用一些文本初始化它时,它会自动将''添加到末尾。

char* c = "Hello";

这将创建一个包含六个元素的char数组。是的,六个元素。

c = {'H', 'e', 'l', 'l', 'o', ''}

当您打印c时,它将进行搜索,直到找到''。如果有人替换它怎么办?

c[5] = '!';

然后系统无法确定文本的结尾。然后,它将继续读取内存(不属于该变量,甚至可能是程序),直到它达到null字符。

这是将大小(或要读取的数字或字符)传递给函数的主要原因。

另一方面,如果需要从流中读取一些数据,可以使用缓冲区。在这种情况下,应该指定要读取的字节数,这样就不会导致缓冲区溢出。

以上答案切中要害。所以我将和char *一起讨论传球长度练习背后的另一个视角。

正如其他人所说,并非总是,char *指向的字符串以结束。只有当字符串以结尾时,strlen()才会真正起作用。有一些特定的用例,例如二进制编码,其中数据表示为字符串。在这种情况下,char *不会以结束。此外,可能有某些用例只能读/写到特定的长度/大小。在这种情况下,总是需要测试输入长度是否在总字符串的长度范围内。因此,通常情况下,长度是显式传递的,调用方可以根据需要以任何方式使用它。