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;
}
我用 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;
}