gpt4 book ai didi

c++ - char数组-处理内存

转载 作者:行者123 更新时间:2023-11-30 20:43:46 25 4
gpt4 key购买 nike

Possible Duplicate:
Why can't I edit a char in a char*?




char *k ;

void ffill()
{
char *d="ddddd";
*k=*d; //expecting to copy "ddddd" to *k
cout<<k<<"\n";
*d[1]=5; // trying to change array element
cout<<k<<"\n";
}

int _tmain(int argc, _TCHAR* argv[])
{
ffill();
cout<<k<<"\n";
}


过程填充借助局部变量来初始化字符数组k。我不确定它会复制 "ddddd"变量指针(这是错误的,因为在自动销毁d内存后并不安全)还是它会复制值并正确初始化了 *k之后。

如何对 *d数组元素进行ace运算?编译器对 *d[1]=5;不满意

最佳答案

(免责声明:此答案仅涵盖C ++。不建议同时使用C和C ++,因为两种语言都完全不同)

序幕

char *k ;


这声明了一个指向字符的指针。

"ddddd"


此表达式的类型为 char const[6],即六个常量字符的数组。可以将这种类型的表达式隐式转换为指向数组第一个元素的指针。该指针的类型为 char const*,即指向常量字符的指针。 char const*不能转换为 char*,因为 char*允许修改其指向的字符,而 char const*不允许。

char *d="ddddd";


由于上述规则,此陈述是不正确的。您应该在编译器上打开警告,它会警告您(理想情况下实际上是错误,而不仅仅是警告)。如果您确实想要一个指针,则应为 char const* d = "ddddd";;如果您想要一个数组,则应为 char d[] = "ddddd";。第二种形式不需要 const,因为它可以进行复制,因此没有更改原始数据( const)的风险。

*d


该表达式涉及对上述 char const*的隐式转换,然后将间接运算符( *)应用于该表达式,从而得到类型为 char const&的表达式,即对常量字符的引用。

*k


*d相似,它对指针执行间接操作。在这种情况下, k的类型为 char*,因此结果表达式的类型为 char&

*k=*d; //expecting to copy "ddddd" to *k


该分配分配一个字符,因为它是从对常量字符的引用到对字符的引用的分配。最后,将字符串的第一个字符分配给 k所指向的字符,即...等待。

k指向哪里?它从未被初始化!这注定要以悲剧告终。

第1章

那么,如何使 k指向某处?以及如何将整个字符串从 d复制到该空间?

要将 d数组的六个字符复制到 k,我们需要六个字符的空间。最简单的方法是仅组成六个字符的数组。

char k[6];


现在,如何复制这六个元素?我们可以使用C库函数 strcpy,该函数复制以空字符结尾的字符串。使用此功能需要非常小心,因为:


它要求源有一个空( '\0')字符来标记结尾;如果源没有这样的字符,则行为是不确定的,任何事情都可能发生。这就是字符串 "ddddd"具有六个字符而不是5个字符的原因:编译器为您插入的末尾有一个隐式 \0字符。
它要求目标为整个源字符串(包括空终止符)留有足够的空间。如果目的地没有足够的空间,则该行为也是不确定的,并且可能发生任何事情。


这是此函数可用于复制字符串的方式:

std::strcpy(k, d);


未能达到第1点或第2点可能会导致任何事情,从看似有效的程序(如果您不走运)到以奇怪的方式随机运行,甚至崩溃(如果您很幸运)。

结语

伙计,那是很多信息。 C ++程序员是否必须时刻关注这些问题?那一定很累。

好吧,C ++程序员可以使用 std::string而不是字符数组,从而减少很多麻烦:我们可以使用赋值运算符进行复制,我们不需要跟踪正确的大小,我们不需要关心有了空终止符,我们就不需要在编译时限制大小,还有很多其他优点。

std::string k;

void ffill()
{
std::string d="ddddd";
k = d;
cout<<k<<"\n";
d[1]=5;
cout<<k<<"\n";
}

关于c++ - char数组-处理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11614916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com