在赋值C后访问char *

时间:2010-05-31 13:24:06

标签: c

我已将成员变量的值分配为:

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

strcpy(mValue, inValue);

在分配时,该值是正确的(采取printf输出):

http://www.w3.org/2001/XMLSchema

但是,当我在病房之后得到它的价值时,我得到它:

http://www.w3.org/2001/XMLSchema(!

这个问题可能是什么问题

3 个答案:

答案 0 :(得分:15)

strlen()返回但不包括终止NUL,因此您需要在malloc()中返回1。因此myValue最终没有终止。

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

答案 1 :(得分:2)

strcpy(myValue,inValue)函数将字符串inValue的内容复制到malloc分配的内存块中,该字符串附加了字符串终止控制字符'\ 0'。

一旦strlen(inValue)返回不包含'\ 0'控件字符串的字符串长度,malloc分配的区域(strlen(inValue)* sizeof(char))不足以接收strcpy(myValue, inValue)。

因此,'\ 0'字符被复制到不允许的内存位置,覆盖其他程序数据,并可能导致段错误,BAD ACCESS,GPF或其他类似错误消息并显示不可预测的结果,具体取决于在编译器/操作系统/平台上。

在你的情况下,你在执行strcpy之后得到了一个正确的结果,但是稍后字符串似乎被破坏了,因为'\ 0'已被复制到一个不属于分配给myValue的块,该块的所有者可能只是更改它,并且您的字符串将丢失其结束后缀。因此,如果您在此之后尝试再次打印myValue,则可能会显示程序错误或仅显示垃圾。

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

还有一件事......在你的例子中,你写了strcpy(mValue,inValue)而不是strcpy(myValue,inValue),但我认为你在撰写帖子时输入错误。

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

strcpy(myValue, inValue);

答案 2 :(得分:1)

您不应该从malloc调用转换返回类型。并且始终包含stdlib.h。

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

希望有所帮助,