2301_79749306 2023-12-05 20:21 采纳率: 0%
浏览 1

Dev C++ C code 编译bug

img

用Dev C++ 写C的时候,编译文件,出现这个问题,请问怎么修复?跳转到了另外一个文件,无法对原来想编译的文件进行编译。貌似动到了软件文件。求指教,感谢!

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-05 22:15
    关注

    【相关推荐】



    • 这篇博客: 黑马程序员c++教程,利用类模板实现数组封装案例中,一种断点bug的产生原因及解决方案中的 原因分析: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      在堆区开辟内存存储数据时,new关键字的使用方式错误,将“[]”写为了“()”

      在笔者将自己的代码与视频教程中的代码对比后,笔者发现了原因。
      在有参构造函数、拷贝构造函数,以及重载赋值运算符函数这三个函数中,需要在堆区上开辟一段连续的内存,用来存储数组的元素。
      要做到这一点,就需要使用new关键字
      具体语法为:

      接收指针p = new 数据类型 [元素个数]
      

      其中,用来包含元素个数的是中括号“[]”
      但笔者在代码中却使用了小括号“()”
      以有参构造函数为例:
      错误的写法:

      template<typename T>
      MyArray<T>::MyArray(int capacity)
      {
      	this->m_arr = new T(capacity);//错误的写法
      	this->m_size = 0;
      	this->m_capacity = capacity;
      }
      

      正确的写法:

      template<typename T>
      MyArray<T>::MyArray(int capacity)
      {
      	this->m_arr = new T[capacity];//正确的写法
      	this->m_size = 0;
      	this->m_capacity = capacity;
      }
      

      new T[capacity]的含义是,在堆区开辟大小为capacity个T类型数据的内存,并返回第一个数据的指针。
      new T(capacity)的含义则是,在堆区开辟大小为一个T类型数据的内存,将这个T类型数据的值初始化为capacity。

      正是因为笔者写成了后者,所以才导致在测试时,以为创建了5个元素大小的数组,实际上只创建了一个值为5的元素。
      而此时size又是5,自然会导致指针访问越界,从而触发断点。

      int main()
      {
      	MyArray<int> arr(5);
      	int capacity = arr.GetCapacity();
      	for (int i = 0; i < capacity; i++)
      	{
      		arr.PushBack(i);
      	}
      	int size = arr.GetSize();
      	for (int i = 0; i < size; i++)
      	{
      		cout << arr[i]<<endl;
      	}
      }
      


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月5日