这是我的代码,显示了我正在尝试执行的操作,但不起作用。
#include <iostream>
char * getNewStr(char *str)
{
size_t oldsize = strlen(str);
size_t newsize = oldsize + 2;
str = static_cast<char *>(realloc(str, newsize));
str[oldsize] = '\n';
str[oldsize + 1] = '\0';
return str;
}
int main(int argc, const char * argv[])
{
char *str = const_cast<char *>("Hello World");
char *newStr = getNewStr(str);
std::cout << newStr << newStr;
free(newStr);
return 0;
}
我希望结果是
Hello World
Hello World
但是目前,它在realloc()
部分崩溃了。
如何纠正功能getNewStr()
使其起作用?
(PS:getNewStr()
函数的参数和返回类型应为现在的char *
。我不想在函数中使用std::string
。)
答案 0 :(得分:4)
在documentation of realloc中,有以下行:
重新分配给定的内存区域。它必须事先由malloc(),calloc()或realloc()分配,并且尚未通过调用free或realloc进行释放。否则,结果是不确定的。
由于不是从*alloc
函数获得字符串常量的字符指针,因此将其传递给重新分配是无效的。在这种情况下,未定义的行为表现为崩溃,但这不是标准所能保证的(因此为“未定义”)。
在这种情况下,您应该将字符串的副本传递给函数,并记住在完成处理后将其释放。
但是,实际上,如果您使用的是C ++,则应该使用std :: string。
答案 1 :(得分:2)
嗨,您可能应该使用字符串数据类型,并且可以通过以下更简单的方式实现期望的结果
#include <iostream>
using namespace std;
string getNewStr(string & str)
{
str.append("\r\n");
return str;
}
int main(int argc, const char * argv[])
{
string str = "Hello World";
string newStr = getNewStr(str);
std::cout << newStr << newStr;
return 0;
}