首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用strcat后删除字符数组将导致seg错误。

使用strcat后删除字符数组将导致seg错误。
EN

Stack Overflow用户
提问于 2015-07-08 17:26:29
回答 3查看 496关注 0票数 0

在我的代码中,我使用system()调用一个只存在于raspberry pi的shell上的函数,特别是"raspistill“

在执行此操作时,我使用char[]和strcat(),如下所示:

代码语言:javascript
复制
#include <stdlib.h> 

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-08 17:28:39

您正在尝试在分配了常量字符串文本的strcat上调用char[]。这会失败的。另外,您没有理由使用上述的delete[] command,因为您没有在免费存储上动态地分配它(例如使用new[]、malloc等)。

编辑:以下内容与问题的前一次修订有关

你错过了和new[]一起去的delete[]。您刚刚发布的代码甚至不应该编译,因为您没有在任何地方定义name

票数 1
EN

Stack Overflow用户

发布于 2015-07-08 17:35:51

这不是真正的C++。如果您替换了

代码语言:javascript
复制
delete[] command;

使用

代码语言:javascript
复制
free(command);

然后你会得到一个C程序。然而,它仍然是一个be程序--我的观点是,在您的程序中有非常少的C++。

如果您完全采用C++,问题就会得到解决。在现代C++中,任何事情都不使用[]数组(某些非常特殊的情况除外)。如果您想要一个字符集合,可以随意添加和删除字符,那么只需使用string即可。

代码语言:javascript
复制
#include <string>
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()
  return 0;
}

您不需要在编写得很好的(现代的) delete中使用C++。实际上,在这里尝试delete command (或delete &command)是一个严重的错误。

不要使用指针(除了std::shared_ptrstd::unique_ptr,您真正想要的是“远程操作”行为)。不要使用new,也不要使用delete

如果这不能直接回答你原来的问题,很抱歉。但我认为,在这种情况下,直接跳到C++是最好的方法。

票数 2
EN

Stack Overflow用户

发布于 2015-07-08 17:33:06

我想是缓冲区溢出了。command还不够长。你在破坏这堆东西。更糟糕的是,在堆中没有分配的内存上使用delete

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31299567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档