为什么传递给FUNCTION的char*总是带有字符串的len
why char* passed to FUNCTION always with the len of the string
我最近正在学习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 *
指向的字符串以