cpp dll char指针分配,写入内存访问冲突

cpp dll char pointer assignment, writting memory access violation

我用 cpp 编写了一个 dll,构建成功但在尝试将值设置为字符串指针时遇到一些问题。

我的代码如下:

我在 cpp 中使用此 dll 的示例

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include "OCRv1Dll.h" 

using namespace std;

int main()
{
    char *strIn = "abcd";
    char *strOu = "";
    int abc = autoOCR(strIn, strOu);
    return 0;
}

我的 dll 主体

// ocrv1dll.cpp : defines the exported functions for the dll application.
//
//#ifdef _MSC_VER
//#define _CRT_SECURE_NO_WARNINGS
//#endif

#include "stdafx.h"


__int32 __stdcall autoOCR(char* strIn, char* strOut)
{
__int32     intRtn = 6; 
printf("Received string %s\n", strIn);
strOut += 17;
string temp = "abcd";
strcpy_s(strOut, 16, temp.c_str());
return intRtn;
}

发生错误
strcpy_s(strOut, 16, temp.c_str());

正在说访问冲突内存位置...

能否请教一下这个问题? 提前致谢!!

char *strOu = ""; 是指向空字符串的指针(长度为 1 的字符数组)。

当您在函数中编写 strOut += 17; 时,会将指针前进 17 个字符。现在指针指向荒野。这很可能位于只读数据区域,这就是为什么调用 strcpy_s 会导致访问冲突。

要解决此问题,您只需写入已正确分配的内存。您需要设计此函数与其调用者之间的契约;例如指定调用者必须传递至少特定大小的可写缓冲区。

问题 strOu 可能指向程序的只读部分,因此如果您尝试写入它,它将产生内存冲突错误(Unix 系统中的段错误)。

您也可以在这个问题中阅读更多相关信息:String literals: Where do they go?

您需要做的是将一个内存位置作为参数传递给该内存位置,该位置可以写入并且有足够 space 来存储您要生成的字符串。

尝试如下更改 strOut 的定义:

int main()
{
    char *strIn = "abcd";
    char strOu[20]; // just enough to hold the string
    int abc = autoOCR(strIn, strOu);
    return 0;
}