我尝试了一个程序返回一个数组,其中包含数组的指示,其中找到了特定的输入值,但每次运行都会导致错误,这似乎是一个无限的运行时间。在打印出最后发现的指标后,错误似乎就出现了。
有人可以帮忙吗? (附注:我已经看过多个关于删除指针的页面;我应该在这里做这个吗?)
忘了提 - 我希望返回数组的第一个插槽保存数组的大小,以便以后可以在程序中轻松访问
#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;
}
答案 0 :(得分:0)
int* b;
....
*b = a.size();
必须分配 b
。请尝试以下方法:
int* b = new int[a.size() + 1];
b[0] = a.size();
我明白你的意思。 b
在第一个元素中具有神奇的长度。这是在Pascal / Delphi中,但在C / C ++中却不是这样。
答案 1 :(得分:0)
您正在写入您从未声明的堆内存。
int* b;
此指针从未初始化,指向未定义的内存地址。然后,当您使用索引操作符分配匹配项时,您将写入未定义内存地址后面的后续字节。
您需要使用'new []'运算符分配用于存储结果的空间。此外,如果您已正确声明了内存,则会将匹配结果的数量分配给结果数组中的第一个元素 - 这似乎不是您的意图。
使用new []运算符查看C ++中的动态内存分配。
答案 2 :(得分: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;
}
答案 3 :(得分: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;
}