cpp dll char指针赋值,写入内存访问冲突

时间:2015-01-11 08:38:35

标签: c++ dll char

我已经在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());

说访问违规内存位置......

你能否就这个问题赐教我? 提前谢谢!!

2 个答案:

答案 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;
}