【问题标题】:Why this C++ assignment statement is illegal?为什么这个 C++ 赋值语句是非法的?
【发布时间】:2014-08-18 12:59:31
【问题描述】:

我的代码是这样的:

void main(){
    char test[]  = "aaa";
    char* test2  ;
    *test2 = * test;
    Permutation(test);
    system("pause");

}

这段代码可以正常运行。但是当我把它改成:

void main(){
    char* test  = "aaa";
    char* test2  ;
    *test2 = * test;

}

vs 2012 报告错误。我实际上知道在“char * []”方式和“char a[]”方式之间删除字符串时的区别。但我不知道这个错误是如何发生的。 有谁能帮帮我吗?

【问题讨论】:

  • 这个有数百个重复项。
  • 你正在取消引用一个未初始化的指针。
  • 两段代码都有未定义的行为。第一个运气不好,不会崩溃,而第二个会崩溃。
  • int main,而不是void main。
  • @simple 谁在乎他是否使用 msvc。一旦他切换平台,他就会很快学会(并不是说重构它是一个巨大的负担)

标签: c++ arrays string


【解决方案1】:

我不知道这个错误是怎么发生的

你永远不会初始化 test2 指向任何东西,所以用 *test2 取消引用这个无效指针会产生未定义的行为。这可能会导致程序崩溃,或破坏某些随机内存位置,或执行其他任何操作。

谁能帮帮我?

如果您只想复制第一个字符,请使用字符而不是指针。

char test2 = *test;

如果你想要整个字符串的副本,最好的办法是使用std::string;乱用指针通常比它的价值要麻烦得多。

std::string test = "aaa";
std::string test2 = test;

如果您出于某种原因真的想使用 C 风格的字符数组,那么您需要分配一个足够大的数组并将字符复制到其中(可能使用 memcpy 或 str(n)cpy)。我不会举例,因为我不想鼓励这种事情。

【讨论】:

    【解决方案2】:

    对于这两个代码,您分配*test2= *test; 它会导致第一个代码崩溃;第二个代码,只有第一个'a'被分配给test2。如果你想分配整个“aaa”,你应该做test2= test;,因为*test只指向第一个值'a'。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2018-12-06
      • 2023-04-03
      • 2012-01-05
      相关资源
      最近更新 更多