在尝试使用递归查找集合子集的总数时,我遇到了分割错误
while trying to find total number of subset of a set using recursion, I am getting segmentation fault
//递归程序来查找集合的所有子集
#include<iostream>
using namespace std;
const int n =3;
int arr[n]={1,2,3};
void pass(int *tmp,int tmpArrayIndex, int OriginalArrayIndex)
/*
* int* tmp is temporary array to store
* int tmpArrayIndex == size of array is diiferent at different level, indicates the position to insert element
* int OriginalArrayIndex == positon of element in original array for which decision is to made ot select or reject a element
*/
{
if(OriginalArrayIndex == n)
{
cout<<tmp<<endl;
return;
}
tmp[tmpArrayIndex] = arr[OriginalArrayIndex];
pass(tmp,tmpArrayIndex+1,OriginalArrayIndex+1);
pass(tmp,tmpArrayIndex,OriginalArrayIndex+1);
}
int main(void)
{
int *tmp;
pass(tmp,0,0);
return 0;
}
程序编译成功,但在执行时显示分段错误。 上述程序的预期输出应为 123 12 13 1 23 2 空 总共 8 个子集为 2^3=8。
没有"数组"tmp
的引用或指针。变量tmp
是一个指针 true,但如果你这样做tmp = new int[3]
那么tmp
将指向与arr
无关的新数组的第一个元素。tmp[i] = arr[i]
复制元素,两个数组仍然是不同且独立的,并且tmp
指向的数组中的任何内容都不会"引用"或"指向"arr
的任何元素。
从图形上看,两个数组和指针将如下所示(tmp = new int[3]
之后(:
+--------+--------+--------+ |到达[0] |到达[1] |抵达[2] | +--------+--------+--------+ +-----+ +--------+--------+--------+ |TMP |--> |TMP[0] |TMP[1] |TMP[2] | +-----
+ +--------+--------+--------+这两个数组是两个独立且不同的实体,没有关系。
如前所述
tmp[i] = arr[i];
将值从arr[i]
复制到tmp[i]
。这类似于做
int temporary_value_copy = arr[i];
tmp[i] = temporary_value_copy;
有了上面的两行,你还会声称tmp[i]
"参考"或"点"arr[i]
吗?我希望不会。
此外(如前所述(,由于tmp
是一个指针,那么
std::cout << tmp;
将打印指针本身,而不是它可能指向的可能数据。要打印tmp
指向的数组的所有元素,您需要一个循环:
for (size_t i = 0; i < 3; ++i)
std::cout << tmp[i];
根据某个程序员的建议更正代码
#include<iostream>
using namespace std;
const int n =3;
int arr[n]={1,2,3};
void pass(int *tmp,int tmpArrayIndex, int OriginalArrayIndex)
{
if(OriginalArrayIndex == n)
{
for(int j=0;j<tmpArrayIndex;++j)
cout<<tmp[j]<<" ";
cout<<endl;
return;
}
tmp[tmpArrayIndex] = arr[OriginalArrayIndex];
pass(tmp,tmpArrayIndex+1,OriginalArrayIndex+1);
pass(tmp,tmpArrayIndex,OriginalArrayIndex+1);
}
int main(void)
{
int* tmp = new int[n];
int tmpArrayIndex = 0;
int OriginalArrayIndex = 0;
pass(tmp, tmpArrayIndex,OriginalArrayIndex);
return 0;
}
输出:
1 2 3
1 2
1 3
1
2 3
2
3
这是预期的输出。
PS: a newline after last output entry i.e 3, indicates empty subset.
相关文章:
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- 我在 ndk 中构建文件时遇到错误 android.mk
- 我们在批处理模式下使用 G++ 时遇到错误
- 在visual Studio中构建代码时,我遇到错误,.h文件丢失
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- 可中断线程类 C++11 - 遇到错误?
- 在尝试在同一类内部进行课程矢量时,我会遇到错误
- 使用向量和结构在C 中遇到错误
- 我正在尝试安装游戏引擎,但遇到错误
- 使用 bazel 从源代码构建张量流服务遇到错误:C++规则'@org_tensorflow//…'编译失败(出口 4)
- 为什么尝试这样的类代码时会遇到错误?我初学者对不起
- 当 Mingw 为 C++ 编译 OpenCV 时,我遇到错误?
- 遇到错误试图在功能型参数中使用void函数的错误
- 尝试使用Boost和Ncurses库进行编译程序时会遇到错误
- 我在使用C 的Hangman游戏中遇到错误
- 为什么我在加载共享库时遇到错误
- 我在 c++ 中遇到错误'PTHREAD_START_ROUTINE'未在此范围内声明
- 学习如何在遇到错误'variable not declared in scope'的 c++ 中使用指针
- 如果遇到错误,如何重复代码
- 当我尝试将UDP套接字绑定到带有SFML的端口时,为什么会遇到错误