我已经在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());
说访问违规内存位置......
你能否就这个问题赐教我? 提前谢谢!!答案 0 :(得分:2)
char *strOu = "";
是一个指向空字符串的指针(长度为1
的char数组)。
在函数中,当您编写strOut += 17;
时,会使指针前进17
个字符。现在指针指向荒野。这可能是在只读数据区域,这就是调用strcpy_s
导致访问冲突的原因。
要解决此问题,您只需要写入已正确分配的内存。您需要在此函数与其调用者之间设计一个契约;例如,指定调用者必须传递至少特定大小的可写缓冲区。
答案 1 :(得分:0)
问题strOu
可能指向程序的只读部分,因此如果您尝试写入它,它将生成内存冲突错误(Unix系统中的段错误)。
您也可以在此问题中详细了解它:String literals: Where do they go?
您需要做的是将一个可以写入的内存位置作为参数传递,并且该内存位置有足够的空间来存储您想要生成的字符串。
尝试按如下方式更改strOut的定义:
int main()
{
char *strIn = "abcd";
char strOu[20]; // just enough to hold the string
int abc = autoOCR(strIn, strOu);
return 0;
}