longsiyu 发表于 2020-3-6 16:49:03

请问一下这个问题怎么解决??

int main()
{
        int len = 1;
        int* p = new int;

        for (int i = 0; i < 9; i++)
        {
                *(p + i) = i + 1;

                cout << p + i << " / " << *(p + i) << endl;

                len++;
        }

        delete[] p;
        system("pause");
        return 0;
}




请问一下运行时可以正常输出地址和解引用,但是会报错。。。

不知道哪里的问题。。。len 我在循环中len++了的。

qiuyouzhi 发表于 2020-3-6 17:08:57

我这里没有报错啊?

major_lyu 发表于 2020-3-6 17:32:54

本帖最后由 major_lyu 于 2020-3-6 19:13 编辑

len++了,但是p指向的空间你是在for循环之前new的,只要一个int的空间。len变大不代表p指向的数组就变大了啊。


int main()
{
      int len = 1;
      int* p = new int; // 这一只分配了一个int的空间。

      for (int i = 0; i < 9; i++)// 访问p所指向的int空间之后的空间是不安全的。
      {
                *(p + i) = i + 1;

                cout << p + i << " / " << *(p + i) << endl;

                len++;
      }

      delete[] p;
      system("pause");
      return 0;
}

你是想要动态分配空间么?

longsiyu 发表于 2020-3-6 19:24:37

major_lyu 发表于 2020-3-6 17:32
len++了,但是p指向的空间你是在for循环之前new的,只要一个int的空间。len变大不代表p指向的数组就变大了 ...

对呀,循环中len++意思就是想动态分配,可以实现吗?

major_lyu 发表于 2020-3-6 19:31:40

本帖最后由 major_lyu 于 2020-3-6 19:43 编辑

longsiyu 发表于 2020-3-6 19:24
对呀,循环中len++意思就是想动态分配,可以实现吗?

要实现动态数组,你只能重新分配更大空间,然后把原有的数据拷贝过去。
所以一般动态数组的实现都是每次当空间存满了还要存储新的数据就分配空间等于原来的二倍的空间,从而减少数据拷贝的频率。
像你这样每增加一个数据就新增一个空间的做法也可以,但是每次都得把之前的数据拷贝一下,效率非常低。

你可以看一下数据结构或者算法书中关于动态数组的讲解。

#include <iostream>
using namespace std;
int main()
{
    int len = 1;
    int *p = new int; // 这一只分配了一个int的空间。

    for (int i = 0; i < 9; i++) // 访问p所指向的int空间之后的空间是不安全的。
    {
      if (i == len) //空间不足
      {
            int *temp = p;
            p = new int; //分配更大空间
            for (int j = 0; j < len; j++) // 拷贝原数据
            {
                *(p + j) = *(temp + j);
            }
            len *= 2;
            delete[] temp; //释放原来的空间。
      }

      *(p + i) = i + 1;

      cout << p + i << " / " << *(p + i) << endl;
    }
    // 最终的数组
    for (int i = 0; i < 9; i++)
    {
      cout << p + i << " / " << *(p + i) << endl;
    }

    delete[] p;
    system("pause");
    return 0;
}

longsiyu 发表于 2020-3-6 19:48:55

major_lyu 发表于 2020-3-6 19:31
要实现动态数组,你只能重新分配更大空间,然后把原有的数据拷贝过去。
所以一般动态数组的实现都是每 ...

非常感谢,学习中。。。
页: [1]
查看完整版本: 请问一下这个问题怎么解决??