2012-03-27 70 views
2

今天我遇到了下面的代码块:当返回一个本地字符数组为什么strcpy工作,但字符串构造函数失败?

#include <iostream> 
using namespace std; 
char *return_char_array(const char *cptr) 
{ 
    char charArray[100] = {0}; 
    strcpy(charArray, cptr); 
    return charArray; 
} 
int main() 
{ 
    const char *cptr = "test"; 

    char localCharArray[100] = {0}; 
    strcpy(localCharArray, return_char_array(cptr)); // output "test" 
    cout<<localCharArray<<endl; 

    string s = return_char_array(cptr);    // corrupt output 
    cout<<s<<endl; 

    return 0; 
} 

当时我还以为这两个输出将被破坏的一见钟情,但令人惊讶的是第一输出为“测试”,而第二个是腐败。有人会告诉我为什么吗?

+0

未定义的行为是未定义的...编辑:实际上,这甚至不会为我编译,因为您给出了'return_char_array()''const char *',并且不能隐式抛弃'const'ness 。但是,我猜这是因为调用'strcpy()'没有在堆栈上放置足够的内存来覆盖特定的内存区域,而创建一个'string'的确如此。 – BoBTFish 2012-03-27 11:28:45

+0

@BoBTFish对不起,我在参数列表中丢失了'const' .. – OriginalWood 2012-03-27 11:34:22

+0

Cure:'std :: string'和其他标准库容器。 – 2012-03-27 11:35:02

回答

6

他们都腐败。只是因为它似乎有效,并不意味着它是好的。

这是未定义的行为,任何事情都可能发生,包括出现工作。

相关问题