努力学各种语言的小白 2024-02-13 12:15 采纳率: 0%
浏览 5

关于#c++#的问题:开拓指针空间,然后循环给指针赋值出错

开拓指针空间,然后循环给指针赋值,为什么int 只需要开辟一个空间,而string需要多个?


```c++
using namespace std;
int main() {
    string *x;
    x = new string;
    for (int i = 0; i < 2; i++) { 
        cin >> *(x + i); 
        cout << *(x + i)<<endl;
    }
}

第二个指针内容无法正常输出,但是int型却可以正常输出
当 x=new string[2] 时才可以正常输出,有小伙伴解释一下吗?

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-13 12:17
    关注

    引自免费微信小程序:皆我百晓生

    在C++中,当你为指针动态分配内存时,你需要确保分配的空间足够存储你打算放入其中的数据。对于int类型和std::string类型,它们的存储需求是不同的。

    1. int 类型的情况:

      int *x;
      x = new int; // 这里只分配了一个int大小的空间
      for (int i = 0; i < 2; i++) {
          cin >> *(x + i); // 当尝试访问*(x+1)时,实际上已经越界,可能导致未定义行为或程序崩溃
      }
      

      对于int,假设其占用4个字节(实际情况可能因平台不同而有所差异),当你仅使用new int开辟空间时,你只能存储一个int值。在循环中尝试通过x+i访问第二个位置会超出分配的内存范围,这是不安全且错误的。

    2. std::string 类型的情况:

      string *x;
      x = new string; // 同样,这里只分配了一个string对象的空间
      for (int i = 0; i < 2; i++) { 
          cin >> *(x + i); // 在这里,对*(x+1)的写入同样是非法的,因为没有足够的内存来存放第二个string对象
          cout << *(x + i)<<endl;
      }
      

      std::string是一个容器类,它包含一个指向字符数组的指针以及表示字符串长度等信息的成员变量。当你用new string创建一个string对象时,它只为一个字符串对象分配了内存。而在循环中连续输入两个字符串并存入同一个对象的不同位置是不可能的,因为每个std::string对象都有自己独立的内存区域。

    3. 正确分配多个std::string对象的方式:

      string *x;
      x = new string[2]; // 此处分配了足够容纳两个string对象的空间
      for (int i = 0; i < 2; i++) {
          cin >> x[i]; // 现在可以通过索引直接访问数组中的每个string对象
          cout << x[i] << endl;
      }
      // 记得释放动态分配的内存
      delete[] x;
      

      上述代码中,new string[2]将会分配一块连续的内存空间,可以存储两个std::string对象。这样,在循环内给每个元素赋值就不会出现越界问题了。

    总结来说,对于数组类型的指针,你需要根据需要存储的数据数量来一次性分配足够的连续内存空间,而对于非数组类型的单个指针对象,每次new操作只会分配对应类型的单个对象所需的空间。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月13日

悬赏问题

  • ¥15 Fatal error in Process MEMORY
  • ¥15 labelme生成的json有乱码?
  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统