Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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++ - Fatal编程技术网

C++ 为空字符赋值*

C++ 为空字符赋值*,c++,C++,在以下代码中: const char * my_func1(char const *str) { const char *a = func(); // returns a char *, but I guess its ok to assign non-const to const if(a == NULL) { MY_String b = str; //MY_String is an inhouse class with string func

在以下代码中:

const char * my_func1(char const *str)
{
    const char *a = func(); // returns a char *, but I guess its ok to assign non-const to const
    if(a == NULL)
    {
        MY_String b = str;      //MY_String is an inhouse class with string functions
        b.replace("\"", "\'");  //replace " with '
        a = (const char *)b;    //MY_string has an operator (const char *)
    } 

    return a;
}

我遇到的问题是,当
a
null
时,它进入
if
块,对
a
的赋值工作不正常,我收到垃圾。是因为
a
null
所以我不能给它赋值吗?如何修复此问题?

我不知道我的字符串是什么。但不管它是什么,它是一个局部变量。因此,它在
if
块的末尾超出了范围。所以不管它的
操作符const char*
做什么,一旦底层对象被破坏,它可能不会给你合理的结果


唯一可行的方法是重载运算符动态分配一个新的
char
缓冲区,并返回指向它的指针。但那太荒谬了。

我不知道我的字符串是什么。但不管它是什么,它是一个局部变量。因此,它在
if
块的末尾超出了范围。所以不管它的
操作符const char*
做什么,一旦底层对象被破坏,它可能不会给你合理的结果


唯一可行的方法是重载运算符动态分配一个新的
char
缓冲区,并返回指向它的指针。但是那将是荒谬的。

当然你可以分配给
一个
,即使它是空的。您不能做的是分配给
*a


b
是否为其成员使用自动存储?如果是这样,请确保您没有从转换运算符返回指向其中一个的指针,因为一旦
b
超出范围,它将变得无效。

当然,您可以分配给
a
,即使它为空。您不能做的是分配给
*a


b
是否为其成员使用自动存储?如果是这样,请确保您没有从转换运算符返回指向其中一个的指针,因为一旦
b
超出范围,它将变得无效。

如果看不到
MY_String
的实际接口,很难判断它的行为,但我将根据您的注释来假设它的行为

它看起来像是您分配给
a
b
中分配的缓冲区。但是,
b
在if块的末尾被禁用。所以
b
被破坏了,他的缓冲区也被破坏了(我想)


这就解释了为什么你的
a
指向垃圾。

如果没有看到
MY_String
的实际接口,很难判断,但我会根据你的评论来假设它的行为

它看起来像是您分配给
a
b
中分配的缓冲区。但是,
b
在if块的末尾被禁用。所以
b
被破坏了,他的缓冲区也被破坏了(我想)


这可以解释为什么
a
指向垃圾。

那么,
b
不再在
if
块之外的范围内。要修复它,首先需要为
a
分配一些内存(使用
new
)。但是,这并不是非常类似C++,而且很容易导致内存泄漏并将整个腿都吹断。

,<>代码> b>代码>如果<<代码>块,则不再在<代码>范围之外。要修复它,首先需要为

a
分配一些内存(使用
new
)。这不是非常类似C++的,而且你很容易造成内存泄漏并把你的整个腿都吹断。

你如何确定“Ato的分配不正常”?还有,什么是
MY_String
?您的代码非常不透明。我们不知道
func
做什么或
MY_String
是什么,
replace
方法实际做什么,cast操作符做什么,等等。另外,如果
MY_String
管理它自己的内存,你会返回一个指向
delete[]
ed内存块的指针。@Oli Charlesworth这是因为,我可以在调试器中运行它,并在“returna”处停止,然后看到a有垃圾。。但是在阅读了评论之后,我觉得任务是有效的,但是在if阻塞之后超出了范围。您如何确定“对a的任务工作不正常”?还有,什么是
MY_String
?您的代码非常不透明。我们不知道
func
做什么或
MY_String
是什么,
replace
方法实际做什么,cast操作符做什么,等等。另外,如果
MY_String
管理它自己的内存,你会返回一个指向
delete[]
ed内存块的指针。@Oli Charlesworth这是因为,我可以在调试器中运行它,并在“returna”处停止,然后看到a有垃圾。。但是在阅读了评论之后,我觉得作业是有效的,但是在if阻止之后超出了范围。所以你的回答是有意义的,我如何避免这一点呢?我的字符串是一个字符串类。我使用它的唯一原因是使用replace函数。我既不能使用该类,也不能手动在上执行搜索和替换。@tryurbest:一个可能的修复方法是从
myfunc1
返回
std::string
myu string
,而不是
const char*
。另一种方法是使用strdup((const char*)b)或类似方法获取要返回的字符串数据的副本,并确保调用者将其释放(这意味着当您返回
a
未更改时,您也必须复制该数据)。另一种方法是让调用方传入另一个参数,一个指向可写缓冲区的指针,其长度足以包含结果数据(如果可以预测的话)。将字符串数据复制到其中,而不是返回指针。到目前为止,最简单的方法是返回
std::string
。因此,您的回答是有意义的,但是如何避免这种情况?我的字符串是一个字符串类。我使用它的唯一原因是使用replace函数。我不能使用该类,也不能手动在上执行搜索和替换。@tryurbest:一个可能的修复方法是从
MY\u func1
返回
std::string
MY\u string