Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数引发写访问异常_C++_C_Exception_Access Violation - Fatal编程技术网

C++ 函数引发写访问异常

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

我在网上读一篇文章或帖子,发现了一个函数,所以我决定在我的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 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
。。。