完全初学者:空指针问题
Complete Beginner: Null pointer issue?
我浏览了所有论坛,试图了解这个问题。我不能完全理解这个问题,也不能找到解决方案的原因是,我对C++还很陌生,不理解错误消息。
这是我在C++中的代码,它从排列或组合公式中找到了可能性的数量。每次我尝试编译和运行时,我都会收到这样的消息:
中0x6a8613af(msvcr100d.dll)处的首次机会异常Combinations_Permutations.exe:0xC0000005:读取访问冲突位置0x00000005。0x6a8613af处出现未处理的异常(msvcr100d.dll)在Combinations_Permutations.exe:0xC0000005:读取访问冲突位置0x00000005。
我在许多其他论坛上了解到,"访问违规读取位置0x00…"肯定表示空指针。但我看不出我在哪里遇到这样一个无效的问题。也许我的变量正在被全局访问,而它们并没有被YET初始化?这是我的代码,我已经用了一段时间了。。。就像我说的,我还是个新手。所以请把我的错误告诉我。非常感谢。
我的代码:
#include <iostream>
#include "conio.h";
using namespace std;
int run_combination(int n, int r);
int run_permutation(int n, int r);
int solve_factorial(int f);
int f_value = 1; //factorial value used recursively
int n_input, r_input;
char choice;
char order;
void main(){
//if user types choice as 'q', while loop ends
while(choice != 'q'){
printf("How many values? (1-9) n");
printf("User: ");
cin >> n_input;//user input for variable n
printf("n_input: %i", n_input);
printf("nHow many will be chosen at a time out of those values? (1-9)n");
printf("User: ");
cin >> r_input; //user input for variable r
printf("nDoes order matter? (y/n)n");
printf("User: ");
cin >> order; //'y' if order is taken into consideration(permutation)
//'n' if order it NOT taken into consideration(combination)
int solution = 0; //temporary variable that represents the solution after running
//n and r through the permutation or combination formula
//if user input values for n and r are in between 1 and 9, then run
//combination or permutation
if (n_input <= 9 && n_input >= 1 && r_input <= 9 && r_input >= 1){
if (order == 'y')
solution = run_permutation(n_input, r_input);
else if (order == 'n')
solution = run_combination(n_input, r_input);
else
printf("nError. Please type 'y' or 'n' to determine if order matters.n");
//if n < r, run_permutation or run_combination returns 0
if (solution == 0){
printf("Error! You can't choose %i values at a time if there n",
"are only %i total values. Type in new values next loop n.", r_input, n_input);
}
else
printf("Number of possibilities: %s", solution);
}
else{ //else error message if numbers are out of range...
printf("Next loop, type in values that range from 1 to 9.n");
}
//option 'q' to quit out of loop
printf("Type 'q' to quit or enter any key to continue.n");
printf("User: ");
cin >> choice;
}
_getch();
}
/*
Returns solved combination of parameters n and r
Takes the form: n! / r!(n-r)!
*/
int run_combination(int n, int r){
if (n < r) //solution is impossible because you can't choose r amounnt at a time if r is greater than n
return 0;
int n_fac = solve_factorial(n); //n!
int r_fac = solve_factorial(r); //r!
int nMinusr_fac = solve_factorial(n-r); //(n-r)!
int solve = ((n_fac) / ((r_fac)*(nMinusr_fac))); // plugging in solved factorials into the combination formula
return solve;
}
int run_permutation(int n, int r){
if (n < r)
return 0;
int n_fac = solve_factorial(n);
int nMinusr_fac = solve_factorial(n-r);
int solve = ((n_fac) / (nMinusr_fac)); //plugging in factorials into permutation formula
return solve;
}
int solve_factorial(int f){
if (f-1==0 || f == 0){ //if parameter f is 1 or 0, return 1
int temp = f_value;
f_value = 1; //reset f_value so that f_value remains 1 at the start of every new factorial
return temp;
}
else{ //else multiply f_value by f-1
f_value *= f;
return solve_factorial(f-1);
}
}
这是一个错误:
printf("Number of possibilities: %s", solution);
solution
是int
,而不是以null结尾的字符串:请使用%d
。
使用类型安全的std::cout
而不是printf()
可以防止此错误:
std::cout << "Number of possibilities: " << solution;
有问题的行是:
printf("Number of possibilities: %s", solution);
您告诉printf
solution
是char*
,因此它试图取消引用(char*)solution
以打印"C字符串"的内容(在您的特定错误消息中,可能是solution
的值为5
时)。
将%s
更改为%d
,或者使用std::cout
而不是printf
,以获得类型安全性,并从一开始就避免此类问题。
相关文章:
- 链表指针问题
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 指针问题:从不兼容的类型"int"分配给"int *"
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- C++指针问题:如何修复这些代码中的错误?
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- 传递空指针到 fwrite 会导致问题吗?
- 完全初学者:空指针问题