在赋值C之后访问char*

在赋值C之后访问char*,c,C,我已分配成员变量的值,如下所示: myValue = (char*)malloc(strlen(inValue) * sizeof(char)); strcpy(mValue, inValue); 赋值时,值正确为(获取printf输出): 但是,当我在wards之后得到它的值时,我得到它为: http://www.w3.org/2001/XMLSchema(! 此问题可能有什么问题strlen()最多返回但不包括终止NUL,因此需要在malloc()中向其返回值添加1。因此,myValu

我已分配成员变量的值,如下所示:

myValue = (char*)malloc(strlen(inValue) * sizeof(char));

strcpy(mValue, inValue);
赋值时,值正确为(获取printf输出):

但是,当我在wards之后得到它的值时,我得到它为:

http://www.w3.org/2001/XMLSchema(!
此问题可能有什么问题

strlen()最多返回但不包括终止NUL,因此需要在malloc()中向其返回值添加1。因此,myValue最终是未终止的

myValue = malloc((strlen(inValue) + 1) * sizeof(char));

您不应该从malloc调用强制转换返回类型。并始终包括标准数据库

myValue = malloc((strlen(inValue) + 1) * sizeof(char));
希望对您有所帮助,

strcpy(myValue,inValue)函数将字符串inValue的内容以及以字符串结尾的控制字符“\0”复制到malloc分配的内存块中

一旦strlen(inValue)返回不包括“\0”控制字符的字符串长度,malloc(strlen(inValue)*sizeof(char))分配的区域就不足以接收strcpy(myValue,inValue)

因此,“\0”字符被复制到一个不允许的内存位置,覆盖另一个程序数据,并可能导致段错误、访问错误、GPF或其他类似于不给出错误消息和显示不可预测的结果的情况,具体取决于编译器/操作系统/平台

在您的情况下,在执行strcpy之后,您得到了正确的结果,但稍晚一点字符串似乎已损坏,因为“\0”已复制到不属于分配给myValue的块的内存位置,而该块的所有者可能刚刚更改了它,字符串将丢失其结束后缀。因此,如果在此之后再次尝试打印myValue,可能会显示程序错误或只是垃圾

要更正代码,必须增加要分配的区域,如下面的代码表所示

还有一件事。。。在您的示例中,您编写了strcpy(mValue,inValue)而不是strcpy(myValue,inValue),但我认为您在撰写文章时输入错误

myValue = (char*)malloc((strlen(inValue) + 1) * sizeof(char));

strcpy(myValue, inValue);

你不需要乘以sizeof(char)它的定义是1。我的答案只是给出了一些使用malloc的技巧。然而,WhirlWind的正确答案是添加1以包含nul。
myValue = (char*)malloc((strlen(inValue) + 1) * sizeof(char));

strcpy(myValue, inValue);