C++ 函数引发写访问异常
我在网上读一篇文章或帖子,发现了一个函数,所以我决定在我的IDE中测试它。该函数编译并生成代码,但当我运行代码时,它希望抛出一个异常:写访问冲突 以下是函数:C++ 函数引发写访问异常,c++,c,exception,access-violation,C++,C,Exception,Access Violation,我在网上读一篇文章或帖子,发现了一个函数,所以我决定在我的IDE中测试它。该函数编译并生成代码,但当我运行代码时,它希望抛出一个异常:写访问冲突 以下是函数: /* Note: in and out may be the same string, it will still work OK */ void longdiv2(const char* in, char* out) { int carry = 0; while (*in) { int n
/* Note: in and out may be the same string,
it will still work OK
*/
void longdiv2(const char* in, char* out)
{
int carry = 0;
while (*in)
{
int numerator = *in++ - '0';
numerator += carry;
carry = (numerator % 2) == 0 ? 0 : 10;
*out++ = '0' + (numerator / 2);
}
*out = '\0';
}
我是这样使用它的:
#include <iostream>
int main() {
char* value = "12345";
char* binResult = '\0';
longdiv2( value, binResult );
std::cout << *binResult << std::endl;
std::cout << "\nPress any key and enter to quit." << std::endl;
char q;
std::cin >> q;
return 0;
}
违规行为是指out
是nullptr
我正在MS Visual Studio 2017 CE上运行此程序,该程序是在运行Win7 Home Premium x64(编译并构建为x86控制台应用程序)的英特尔四核极限上运行的
(注:)我用C++和C++来标记:我这样标注是因为文章提到他们是为C编写的,但是我在C++中使用了相同的函数。p>
*out++
正在访问未指向有效内存的指针。这就是为什么在非法访问内存后,在取消引用时会出现访问冲突。这会管用的
char binResult[10];
在这里,基本上当您将其传递给函数时,您将传递衰减的char*
,并对其进行更改
或者,这也可以
binResult =(char*) malloc(10);
if( binResult == NULL){
perror("Malloc Failed");
}
具体地说,问题归结为指针没有被激活
指向可以存储结果的任何缓冲区。当你尝试
要访问它,您基本上是试图写入一些
你甚至都没有权限这么做。(写入访问冲突)。那是
为什么你会出错
更清楚的是,当您将指针值设置为\0
然后尝试访问它时,不应该感到意外。在第一次迭代中,它会导致nullptr
访问,从而导致错误
完整C
代码:
#include<stdio.h>
void longdiv2(const char* in, char* out)
{
int carry = 0;
while (*in)
{
int numerator = *in++ - '0';
numerator += carry;
carry = (numerator % 2) == 0 ? 0 : 10;
*out++ = '0' + (numerator / 2);
}
*out = '\0';
}
int main(void) {
char* value = "12345";
char binResult[10];
longdiv2( value, binResult );
printf("%s\n",binResult);
return 0;
}
使用gcc 6.3.0编译的代码:gcc-Wall-Werror progname.c
C++
解决方案类似于
/* Here in and out shouldn't point to same thing */
#include <iostream>
#include <string>
void longdiv2(std::string in, std::string& out)
{
int carry = 0;
for(auto x:in)
{
int numerator = x - '0';
numerator += carry;
carry = (numerator % 2) == 0 ? 0 : 10;
out.push_back( '0' + (numerator / 2));
}
}
int main(void) {
std::string value = "12345";
std::string binResult;
longdiv2( value, binResult );
std::cout<<binResult<<std::endl;
return 0;
}
/*这里的输入和输出不应该指向同一个东西*/
#包括
#包括
void longdiv2(标准::字符串输入,标准::字符串输出)
{
整数进位=0;
用于(自动x:in)
{
整数分子=x-‘0’;
分子+=进位;
进位=(分子%2)=0?0:10;
out.push_back('0'+(分子/2));
}
}
内部主(空){
std::string value=“12345”;
std::字符串binResult;
longdiv2(值、结果);
std::cout*out++
正在访问未指向有效内存的指针。这就是为什么在进行非法内存访问后,在取消引用该指针时会出现访问冲突。这会起作用
char binResult[10];
在这里,基本上当您将其传递给函数时,您将传递衰减的char*
,并对其进行更改
或者,这也可以
binResult =(char*) malloc(10);
if( binResult == NULL){
perror("Malloc Failed");
}
具体地说,问题归结为指针没有被激活
指向任何可以存储结果的缓冲区。尝试时
要访问它,您基本上是试图写入一些
您甚至没有权限。(写入访问冲突)。这是
为什么你会出错
更清楚的是,当您将指针值设置为\0
然后尝试访问它时,不应该感到意外。在第一次迭代中,它本身会导致nullptr
访问,从而导致错误
完整C
代码:
#include<stdio.h>
void longdiv2(const char* in, char* out)
{
int carry = 0;
while (*in)
{
int numerator = *in++ - '0';
numerator += carry;
carry = (numerator % 2) == 0 ? 0 : 10;
*out++ = '0' + (numerator / 2);
}
*out = '\0';
}
int main(void) {
char* value = "12345";
char binResult[10];
longdiv2( value, binResult );
printf("%s\n",binResult);
return 0;
}
使用gcc 6.3.0编译的代码:gcc-Wall-Werror progname.c
C++
解决方案类似于
/* Here in and out shouldn't point to same thing */
#include <iostream>
#include <string>
void longdiv2(std::string in, std::string& out)
{
int carry = 0;
for(auto x:in)
{
int numerator = x - '0';
numerator += carry;
carry = (numerator % 2) == 0 ? 0 : 10;
out.push_back( '0' + (numerator / 2));
}
}
int main(void) {
std::string value = "12345";
std::string binResult;
longdiv2( value, binResult );
std::cout<<binResult<<std::endl;
return 0;
}
/*这里的输入和输出不应该指向同一个东西*/
#包括
#包括
void longdiv2(标准::字符串输入,标准::字符串输出)
{
整数进位=0;
用于(自动x:in)
{
整数分子=x-‘0’;
分子+=进位;
进位=(分子%2)=0?0:10;
out.push_back('0'+(分子/2));
}
}
内部主(空){
std::string value=“12345”;
std::字符串binResult;
longdiv2(值、结果);
std::cout更改以下内容:
char* binResult = '\0';
致:
更改以下内容:
char* binResult = '\0';
致:
已经是没有解释的负面评论了…char*binResult='\0';
实际上与编写char*binResult=nullptr;
注意下选程序。只是char*binResult='\0';
这是错误的好吧;我仍然尝试了它,你必须给你的函数传递一个有效的缓冲区。不要指向char或者字符串文字顺便说一句。已经是没有解释的负面评论了…char*binResult='\0';
实际上与编写char*binResult=nullptr;
注意下行投票者。只需char*binResult='\0';
这是错误的好吧;我仍然尝试将其统一化为“您必须向函数传递有效的缓冲区”。不要指向char或string literal(顺便说一句,它甚至不应该编译):不,它是一个整数值。可能是一个警告,但有效地将指针设置为0为什么您认为char*binResult='\0';
不应该编译?它完全有效。我在问题中已经说过它“确实”编译和“生成”;它在运行时抛出了一个异常。我知道运行时异常是什么:我的C有点生疏,很难记住是什么原因导致了C
样式的字符串而不是首选的C++
std::string
..(它甚至不应该编译):不,它是一个整数值。可能是一个警告,但有效地将指针设置为0。为什么您认为char*binResult='\0';
不应该编译?它完全有效。我在问题中已经说过它“确实”编译和“生成”;它在运行时抛出了一个异常。我知道运行时异常是什么:我的C有点生锈了,很难记住是什么原因导致了C
风格的字符串而不是首选的C++
std::string
。。。