【问题标题】:Iterating through array of object using pointer to array使用指向数组的指针遍历对象数组
【发布时间】:2018-11-15 05:13:05
【问题描述】:

我是 C++ 新手,正在使用 C++98 进行作业。我正在尝试使用指向数组的指针遍历对象数组。

它正在正确打印第一个点,然后是一些值。

这里是sn-ps的代码:

struct Point { int x, y; };
int randomNumber(int low, int high ) {
   int randomNumber = low + (rand())/ (RAND_MAX/(high-low));
   cout << setprecision(2);
   return randomNumber;
}

Point *generateCoordinates(int nodesPerBlock) {
    Point cities[nodesPerBlock];
    for (int i = 0; i < nodesPerBlock; i++) {
        cities[i].x = randomNumber(1, 50);
        cities[i].y = randomNumber(1, 50);
    }
    return cities;
}
int main() {
  int nodesPerBlock = 5;
  Point *points = generateCoordinates(nodesPerBlock);
  for (int n = 0; n < (nodesPerBlock-2); n++) {
    cout << "n: x=" << points[n].x << ", y=" << points[n].y << endl;
    cout << "n+1: x=" << points[n+1].x << ", y=" << points[n+1].y << endl;
  }
}

打印出来:

n: x=1, y=4
n+1: x=18, y=11
n: x=2049417976, y=32767
n+1: x=2049417976, y=32767
n: x=2049417976, y=32767
n+1: x=2049417984, y=167804927

而实际打印的分数是:

Point : x=1, y=4.
Point : x=18, y=11.
Point : x=13, y=6.
Point : x=2, y=16.
Point : x=16, y=22.

转介this questionsthis,但目前没有成功。

【问题讨论】:

标签: c++ arrays pointers c++98


【解决方案1】:

cities[nodesPerBlock]generateCoordinates 函数中的一个局部变量,当函数退出时它会超出范围。
您正在向它返回一个地址,并在main 中访问该地址。这是未定义的行为。

您必须使用new(因为您使用的是C++98)在堆上分配cities,然后将该地址返回给main。然后您将能够可靠地访问该地址。

处理完后,别忘了删除main末尾分配的内存。

您可以通过更改您的函数以获取一个额外的参数来避免内存分配和删除,您可以从main 传递该参数。那么cities可以是栈上Points的数组。

void generateCoordinates(Point cities[], int nodesPerBlock);

【讨论】:

  • 为什么不简单地void generateCoordinates(Point cities[], int nodesPerBlock)?这里真的不需要动态分配。而且我很确定 C++98 仍然有 std::vector,这应该是这些天给任何需要堆上动态连续内存的人的默认建议。
  • 我不知道 OP 受到什么限制,是否允许他使用vector。但最好有你建议的函数签名。那么就不需要动态内存分配了。我会更新答案。
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2018-06-30
  • 2012-11-06
  • 2013-05-20
  • 2016-12-23
  • 2012-03-09
  • 2013-03-22
相关资源
最近更新 更多