【问题标题】:difference between char [] and char* when doing strcpy执行 strcpy 时 char [] 和 char* 之间的区别
【发布时间】:2015-11-12 02:59:34
【问题描述】:

我有如下代码,不知道str2str3的实现有什么区别,都给出相同的结果,哪个更容易出错? 编辑:当我测试str2 的表示时,我发现有一次我的代码崩溃了,因为str2 是一个错误的指针!

/* strcpy example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[] = "Sample string";
  char str0[] = "Sample String and more";
  char* str2;
  str2 = new char[40];
  char str3[40];
  strcpy (str2,str1);
  strcpy (str3,str1);
  strcpy (str2,str0);// crash happened here str2 is bad pointer!!!
  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
  delete str2;
  return 0;
}

【问题讨论】:

  • 定义“更容易出错”。
  • str2 更容易出错(例如,在这种情况下你忘了delete 它),并且可能更慢
  • 请标记为 C++ 而不是 C , str2 = new char[40];不是C
  • 这不是 c 它是 c++。
  • 我猜你刚刚用你的编辑回答了你自己的问题:-)

标签: c++ strcpy


【解决方案1】:

除了str2 是一个指针而str3 是一个数组这一事实之外(而且使用指针有点棘手,因为您可能会忘记删除它等),还有另一个问题:内存通过operator new 分配给str2 的空间位于可用空间上。这是一个缓慢的操作。相比之下,str3 具有自动存储持续时间,并且大多数情况下它的内存是在堆栈上分配的,这要快得多。因此,在性能关键代码中,这可能会有所不同。

【讨论】:

  • 我明白你刚才解释的内容............但我无法理解,“坏指针”是否是一个不允许的指针或者它会给出输出但警告?意思是 BAD 指针是否与 SLOW 指针相同,或者在技术上对不同的事物意味着缓慢和坏的意思。 (我希望你明白我的意思是一个 SLOW 指针仍然是合法的,并且可以安全地执行输出,并且大多数情况下没有警告和错误,但是 BAD 指针只是一个错误并且无法执行)对吗??,我的意思是这就是我对它的印象。
  • 一个糟糕的指针是你最糟糕的噩梦。使用它是未定义的行为,程序可能会在看似正常运行 1 年后决定崩溃。
  • 哦,这意味着,BAD 指针将正常或奇怪地执行和工作,但它会工作,我说对了吗?和一个慢速指针??在这种情况下/上下文中会是什么。请原谅我愚蠢的调查,但很长一段时间以来,我的灰色区域都有一个类似的问题悬而未决……我想今天我可能会结束它,因为这个问题正确地针对了我几个月来一直在努力解决的问题。
  • @CodeMan 不,它不起作用。虽然它会编译,但它不会正常工作。它可能看起来有效,但你不应该依赖它。应不惜一切代价避免未定义的行为。慢速指针是指向“冷”内存(未缓存)的指针,因此访问它比访问例如慢堆栈内存。虽然我以前从未见过“慢指针”这个词。
  • @CodeMan 问题是 C++ 编译器无法在编译时验证您是否错误地使用了指针,除非在非常有限的情况下。而且因为 C++ 性能很重要,所以没有运行时验证(这将引入额外的检查成本)。所以指针没有被验证,负担就在程序员身上。这就是为什么最好改用标准容器,例如std::stringstd::vector。它们速度极快,您不必处理与指针相关的所有问题。所以只有在你真正需要的时候才使用指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2014-11-07
相关资源
最近更新 更多