Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过函数后为空字符串_C++_Arrays_String - Fatal编程技术网

C++ 通过函数后为空字符串

C++ 通过函数后为空字符串,c++,arrays,string,C++,Arrays,String,我在数组的第一个元素(“”)上得到一个空字符串,而其他元素是正确的。似乎字符串对象在退出函数后立即被销毁。它与悬空指针无关吗? 如何解决 void func(const char**&ptr) { std::string errorstring = "Test1"; ptr = (const char **)malloc(5 * sizeof(const char *)); ptr[0] = errorstring.c_str(); p

我在数组的第一个元素(“”)上得到一个空字符串,而其他元素是正确的。似乎字符串对象在退出函数后立即被销毁。它与悬空指针无关吗? 如何解决

void func(const char**&ptr)
{
    std::string errorstring = "Test1";
    ptr = (const char **)malloc(5 * sizeof(const char *));
    ptr[0] = errorstring.c_str();
    ptr[1] = "Test2";
    ptr[2] = "Test3";
    ptr[3] = "Test4";
    ptr[4] = "Test5";
}

谢谢

ptr[0]
设置为指向由
errorstring
管理的缓冲区。当函数返回时,
errorstring
超出范围并被销毁,从而取消分配该缓冲区
ptr[0]
成为一个悬空指针。调用者取消引用的任何尝试都将显示未定义的行为。

ptr[0]
设置为指向由
errorstring
管理的缓冲区。当函数返回时,
errorstring
超出范围并被销毁,从而取消分配该缓冲区
ptr[0]
成为一个悬空指针。调用者任何试图取消引用它的行为都将显示未定义的行为。

当您键入
“Text1”
时,将在某个位置分配一个字符数组。 当您键入
std::string errorstring=“Test1”
,然后将使用此数组初始化
errorstring
,它不仅会引用它,还会将整个字符数组-
“Text1”
复制到自己的内存中。在
func
的末尾,将自动调用
errorstring
的析构函数,它将释放自己的内存,使返回的
.c_str()
无效。因此,
ptr[0]
成为一个悬空指针。错误的想法是,
errorstring
与“Test1”相同(只是对“Test1”的引用),因为
=
符号。但是C++中的 > /Cord>意味着赋值,而不是相等。事实上,
errorstring
是一个完全不同于
“Test1”

的对象,当您键入
“Text1”
时,将在某个位置分配一个字符数组。
当您键入
std::string errorstring=“Test1”
,然后将使用此数组初始化
errorstring
,它不仅会引用它,还会将整个字符数组-
“Text1”
复制到自己的内存中。在
func
的末尾,将自动调用
errorstring
的析构函数,它将释放自己的内存,使返回的
.c_str()
无效。因此,
ptr[0]
成为一个悬空指针。错误的想法是,
errorstring
与“Test1”相同(只是对“Test1”的引用),因为
=
符号。但是C++中的 > /Cord>意味着赋值,而不是相等。实际上,
errorstring
是一个与
“Test1”
完全不同的对象。对2.是的,3。做点别的。现代C++代码不需要MALOC或任何新的东西。专注于摆脱任何你认为你需要去malloc或新事物的原因。这和悬空指针无关吗?是的,这正是你分配给<代码> PTR [0 ] < /COD> -一个悬空指针。<代码> STD::向量< /代码>——这就是你在现代C++中使用的,而不是三指针。谢谢PaulMcKenzie。我会试试这个策略。似乎我还没有升级到新的非托管函数。通常,我都是管理型的。对2.是的,3。做点别的。现代C++代码不需要MALOC或任何新的东西。专注于摆脱任何你认为你需要去malloc或新事物的原因。这和悬空指针无关吗?是的,这正是你分配给<代码> PTR [0 ] < /COD> -一个悬空指针。<代码> STD::向量< /代码>——这就是你在现代C++中使用的,而不是三指针。谢谢PaulMcKenzie。我会试试这个策略。似乎我还没有升级到新的非托管函数。通常情况下,我是被管理者。