【问题标题】:Use of char* in C++ for strings在 C++ 中将 char* 用于字符串
【发布时间】:2015-04-10 12:43:14
【问题描述】:
#include<iostream>
using namespace std;
int main()
{
   char *a;
   cin>>a;
   cout<<a;/*when input is string it gives segmentation fault*/
   char* b="hello";/*while this thing works fine*/
   cout<<b;
}

两者到底有什么区别?

【问题讨论】:

  • cin &gt;&gt; a 不正确。
  • 区别是第一个不正确
  • 你需要分配内存:char *a = new char[20];
  • 不同的是你还没有读过你的C++书。
  • 第二个只能正常工作,因为您的编译器已过时。现在禁止从字符串文字到 char* 的转换,所以应该是 char const *b

标签: c++ string pointers


【解决方案1】:

除非显式初始化,否则局部变量不会以任何方式初始化,它们的值是不确定的(实际上看起来是随机的)。这意味着您的指针 a 很可能不会指向有效位置,因此当您使用它获取输入时,程序将写入它不拥有的一些内存,这会导致 undefined behavior(这只是最常见的崩溃原因)。

当你定义变量b 时,你告诉编译器应该指向一个特定的地方,指向一个由编译器创建并归程序所有的字符数组。你初始化这个变量,所以使用它就可以了。但是,请注意,字符串文字是被认为是 只读 的字符数组,所以要正确,您应该这样做,例如

const char* b = "hello";

【讨论】:

    【解决方案2】:

    在第二个示例中,编译器分配的内存是字符串文字的特殊位置,在第一个示例中没有这样的空间...

    由于cin 不限制您输入的输入量,您不应该使用它来填充裸char * 缓冲区,除非您确实将输入限制为小于缓冲区

    但你理论上可以做类似的事情(我认为......如果流覆盖这样工作):

    char *a = (char *)malloc(500);
    cin >> setw(500) >> a;
    

    【讨论】:

    • 为什么你会在 C++ 中为此使用malloc()
    • 因为我是一个了不起的 C 程序员和一个糟糕的 C++ 程序员 :)
    • @Karthikeyan.R.S 你必须在 c++ 中转换 malloc 的返回,而不是在 C 中,我已经阅读了很多次这个答案,原则上不同意。
    【解决方案3】:

    你需要分配空间来存储字符,在

    cin >> a;
    

    您将它们存储到无效位置,因为 a char 指针尚未指向有效内存,因此您需要使其指向有效块

    1. 您可以像这样通过new 运算符请求

      a = new char[length];
      cin >> a;
      

      但你需要小心做

      delete[] a;
      

      当你用完它时,还要注意不要写超过length - 1字节。

    2. 将其声明为类似数组

      char a[100];
      cin >> a;
      

      届时将有效。

    但是你应该避免在 c++ 中使用 std::string 来代替。

    【讨论】:

      【解决方案4】:
      char *a;// it is pointer which is memory was unallocated. 
      

      所以使用它你无法获得它的价值。您必须为此动态分配内存。

      char *b="hello";
      

      "hello" 将存储在只读存储器中。所以cout 只需打印该内容即可。

      【讨论】:

      • 应该是const char* b = "hello"。您复制的代码多年来一直是非法的 C++,在此之前已弃用十年,自 C 诞生以来就不安全。
      【解决方案5】:

      您已经声明了一个指针,但您没有留出任何内存来存储字符串本身。在您的代码中,a 尚未初始化为指向任何有意义的地方。您需要将其设置为指向现有缓冲区:

      char buf[SOME_SIZE];
      char *a = buf;
      

      或者您需要在运行时分配该内存:

      char *a = new char[SOME_SIZE];
      

      原因

      char *b = "hello";
      

      有效的是已经留出空间来存储字符串文字"hello",并将该字符串的地址分配给b。请注意,尝试更新字符串文字的内容将调用未定义的行为(至少在 C 中,而且我有理由确定它在 C++ 中是正确的),因此您不想编写类似

      的内容
      cin >> b;
      

      只要b 指向文字。

      【讨论】:

      • “而且我有理由确信它在 C++ 中是正确的” 它曾经是。但随后转换被弃用并最终被彻底禁止。 char* b = "hello" 现在在 C++ 中是非法的。
      【解决方案6】:

      这两种结构都是错误的。这首先在它指定的效果上是错误的,但如果这是代码的唯一问题,编译器将不得不强迫您创建一个具有这种不良效果的可执行文件。第二个构造是错误的,因为它违反了 C++ 语言的规则,因此符合标准的编译器不会接受它。


      第一个构造:

      char *a;
      cin>>a;
      

      使用未初始化的指针变量a。这会导致未定义的行为,程序可能会崩溃,或者向 Swizz 总裁发送愤怒的电子邮件,或者做你认为它会做的事情,等等。编译器必须生成可执行文件,但可能会发出警告诊断信息。


      第二个构造:

      char* b="hello";
      

      在标准 C++ 中无效。标准 C++ 不提供从字符串文字到 char* 的转换。然而,一些编译器可能仍然接受它,然后将 b 初始化为指向字符串 "hello" 中第一个字符的指针。


      您应该使用std::string,而不是处理原始指针等,如下所示:

      #include <iostream>
      #include <string>
      using namespace std;
      
      auto main() -> int
      {
          string a;
          getline( cin, a );
          cout << a << "\n";
          string const b="hello";
          cout << b << "\n";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 2018-03-27
        • 2013-05-13
        • 2021-07-19
        • 1970-01-01
        • 2016-11-07
        相关资源
        最近更新 更多