访问冲突写入位置0x00000000.memset函数问题

Fro*_*and 1 c++ string

#include <iostream>
#include <string.h>
using namespace std;

void newBuffer(char* outBuffer, size_t sz) {
    outBuffer = new char[sz];
}

int main(void) {

    const char* abcd = "ABCD";
    char* foo;
    foo = NULL;
    size_t len = strlen(abcd);
    cout<<"Checkpoint 1"<<endl;
    newBuffer(foo, len);
    cout<<"Checkpoint 2"<<endl;

    cout<<"Checkpoint 2-A"<<endl;
    memset(foo, '-', len);
    cout<<"Checkpoint 3"<<endl;
    strncpy(foo, abcd, len);
    cout<<"Checkpoint 4"<<endl;
    cout << foo << endl;

    int hold;
    cin>>hold;
    return 0;
Run Code Online (Sandbox Code Playgroud)

}

此程序在检查点2-1和3之间崩溃.它尝试做的是将char数组foo设置为char' - ',但由于某些访问问题而失败.我不明白为什么会这样.非常感谢你提前!

Set*_*gie 6

您的newBuffer函数应该通过引用接受第一个参数,以便调用者可以看到函数内部对它所做的更改:

void newBuffer(char*& outBuffer, size_t sz) {
    outBuffer = new char[sz];
}
Run Code Online (Sandbox Code Playgroud)

就像现在一样,你将结果赋给new char[sz]局部变量outBuffer,它只是调用者变量的副本foo,所以当函数返回它时就好像什么也没发生过(除了你泄漏的内存).

此外,您还有一个问题,即您将缓冲区分配给长度ABCD为4 的大小.这意味着您可以在该缓冲区中保留最多3个字符,因为最后一个字符是为NUL终结符保留的.你需要+ 1在某个地方添加长度(我会在调用函数时执行它,而不是在函数内部,因为newBuffer不应该专门用于C字符串).strncpy如果源字符串足够短,则只有NUL终止缓冲区,因此在这种情况下,只有幸运的是,0在分配了缓冲区后,内存中才会出现内存.

也不要忘了delete[] foomain你用它做后(尽管它并不重要,这种规模的程序).