gpt4 book ai didi

c++ - 访问冲突写入位置 0x00000000。 memset 函数问题

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:11 28 4
gpt4 key购买 nike

#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;

此程序在检查点 2-1 和检查点 3 之间崩溃。它试图将字符数组 foo 设置为字符“-”,但由于某些访问问题而失败。我不明白为什么会这样。非常感谢您!

最佳答案

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

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

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

还有一个问题是,您将缓冲区分配给 ABCD 的长度大小,即 4。这意味着您最多可以在该缓冲区中容纳 3 个字符,因为其中一个是保留的对于末尾的 NUL 终止符。您需要将 + 1 添加到某处的长度(我会在调用函数时这样做,而不是在函数内部,因为 newBuffer 不应该专门用于 C-字符串)。如果源字符串足够短,strncpy 仅以 NUL 终止缓冲区,因此在这种情况下,您很幸运,在您的缓冲区之后内存中恰好有一个 0分配。

也不要忘记在完成后在 maindelete[] foo(尽管对于这么大的程序来说这并不重要) .

关于c++ - 访问冲突写入位置 0x00000000。 memset 函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10573340/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com