-1

我尝试了一个程序来返回一个数组,其中包含找到特定输入值的数组的索引,但是每次运行都会导致错误,这似乎是无限的运行时间。该错误似乎是在打印出找到的最后一个索引后立即发生的。

任何人都可以帮忙吗?(旁注:我已经看过多页关于删除指针的内容;我应该在这里这样做吗?)

忘了提 - 我希望返回数组的第一个插槽保存数组的大小,以便稍后在程序中轻松访问它

#include <iostream>
#include <vector>
using namespace std;

int* linearSearch(int* n, int k, int f) {
    // Input: Index 0 Address ; Size of Array; Element to Search
    // Output: Array of Found Indicies
    vector <int> a;
    int* b;
    for(int i = 0; i < k; i++)
        if(n[i] == f)
            a.push_back(i);
    *b = a.size();
    for(int i = 0; i < a.size(); i++)
        b[i + 1] = a[i];
    return b;
}

int main() {
    int c[10] = {4, 4, 6, 3, 7, 7, 3, 6, 2, 0};
    int* k = linearSearch(&c[0], sizeof(c)/sizeof(int), 4);
    for(int i = 0; i < k[0]; i++) {
        cout << "Found at index: " << k[i + 1] << endl;
    }
    return 0;
}
4

4 回答 4

0

您正在写入从未声明过的堆内存。

int* b;

该指针从未被初始化,指向一个未定义的内存地址。然后,当您使用索引运算符分配匹配项时,您将写入未定义内存地址之后的后续字节。

您需要使用“new[]”运算符分配空间来存储结果。此外,如果您正确地声明了内存,您会将匹配结果的数量分配给结果数组中的第一个元素——这似乎不是您的意图。

看看 C++ 中使用 new [] 运算符的动态内存分配。

于 2013-02-27T23:59:44.863 回答
0
int* b;
....
*b = a.size();

b必须分配。尝试以下操作:

int* b = new int[a.size() + 1];
b[0] = a.size();

我明白你的意思了。b在第一个元素中会有神奇的长度。这在 Pascal/Delphi 中是这样,但在 C/C++ 中不是这样。

于 2013-02-27T23:57:05.867 回答
0

这并不完美,但这更接近于正确的实现,您应该能够通过一些工作更进一步:

#include <iostream>
#include <vector>
using namespace std;

std::vector<int> linearSearch(int* n, int k, int f)
{
  vector <int> a;

  for(int i = 0; i < k; i++)
  {
      if(n[i] == f)
      {
          a.push_back(i);
      }
  }

  return a ;
}

int main() {
  int c[10] = {4, 4, 6, 3, 7, 7, 3, 6, 2, 0};
  std::vector<int> result = linearSearch(&c[0], sizeof(c)/sizeof(int), 4);

  for(unsigned int i = 0; i < result.size(); i++)
  {
      cout << "Found at index: " << result[i + 1] << endl;
  }
  return 0;
}
于 2013-02-28T00:06:20.767 回答
0

如果您仍然使用 std::vector,为什么不在最需要的地方使用它呢?此外,如果您不打算通过该指针修改数组,请通过 const 指针表示:

std::vector<int> linearSearch(const int* n, int k, int f)
{
   std::vector<int> res;
   for(int i = 0; i < k; i++)
        if(n[i] == f) res.push_back(i);
   return res;
}

int main() {
    int c[10] = {4, 4, 6, 3, 7, 7, 3, 6, 2, 0};
    std::vector<int> k = linearSearch(&c[0], sizeof(c)/sizeof(int), 4);
    for(int i = 0; i < k.size(); i++) {
        cout << "Found at index: " << k[i] << endl;
    }
    return 0;
}
于 2013-02-28T00:07:34.973 回答