cuốn sách gpt4 ai đã làm

c++ - 使用 strcat 后删除字符数组会导致段错误

In lại Tác giả: Walker 123 更新时间:2023-11-28 02:24:11 hai mươi bốn 4
mua khóa gpt4 Nike

在我的代码中,我使用 system() 来调用仅存在于树莓派外壳上的函数,特别是“raspistill”

执行此操作时,我按如下方式使用 char[] 和 strcat():

#include  

int main(int argc, char * argv[]){
if(argc != 2) return -1;
char command[] = "raspistill -o ";
strcat(command, argv[1]);
system(command);
delete[] command;
trả về 0;
}

我收到警告说要删除的长度是 15,这是初始化命令时的初始长度,而不是 strcat 函数后的新长度。

当我改用带有 append() 的 C++ 字符串时,这个问题就消失了。为什么这会导致段错误,我该如何避免?

câu trả lời hay nhất

这不是真正的 C++。如果你更换

delete[] command;

free(command);

然后你会得到一个C程序。然而,它仍然是一个有问题的程序——我的观点是你的程序中只有很少的 C++。

如果您完全接受 C++,问题就会得到解决。在现代 C++ 中,您不会将 [] 数组用于任何事情(除非在某些非常特殊的情况下)。如果您想要一个字符集合,您可以在其中随意添加和删除字符,那么只需使用 sợi dây.

#include 
using std::string;

int main(int argc, char * argv[]){
if(argc != 2) return -1;
string command = "raspistill -o ";
command.append(argv[1]);
system(command.c_str()); // unfortunately, system() doesn't accept string
// directly, must convert to pointer with .c_str()
trả về 0;
}

在编写良好的(现代)C++ 中,您不需要delete。事实上,在此处尝试delete command(hoặcdelete &command)将是一个严重的错误。

不要使用指针(std::shared_ptrstd::unique_ptr 除外,在这些地方您确实需要“action-at-a-distance”行为)。不要使用mới,也不要使用delete.

如果这不能直接回答您原来的问题,我们深表歉意。但我觉得在这种情况下直接跳到 C++ 是最好的方法。

关于c++ - 使用 strcat 后删除字符数组会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31299567/

hai mươi bốn 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress