消息关闭
    暂无新消息!
std::string st{"123"};

auto a = st.c_str();
char b[3]; // 这里是3,4就没有问题,3就会导致 a 的内容编程乱码
strcpy(b, a);

我看 strcpy 的实现不都是对 b 指向的空间进行写操作吗?

7个回答

︿ 1
char b[3]; // 这里是3,4就没有问题,3就会导致 a 的内容编程乱码

这个应该是不一定的,a的内容可能会被破坏,可能没问题,要看编译器。
破坏的原因是由于b的长度不足,栈越界了。

你打印一下a,b的内存地址看看,应该就清楚了。 
︿ 1
To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the name of the variable.


Click OK to set the breakpoint. 
︿ 0
以上各位,我知道应该是4个。

我只是想弄明白,为什么写3个,会改变 a。
︿ 0
《C++ Primer 中文版第四版》中提到“为了兼容C语言,C++中所有字符串字面值都由编译器自动在末尾添加一个空字符”,字符串字面值是一串常量字符,用双引号括起来的零个或多个字符表示。也就是说,如果是‘a',它的长度是1个字节,而“a”,则它的长度是2个字节。因此,st的长度应该是4个字节而不是3个
︿ 0
理解讨论之前请先学会如何观察

学会使用数据断点:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
︿ 0
C字符串需要\0作为结束标志
所以要存下 st 的C字符串,至少需要4个char