错误阅读角色strcpy()返回值的字符串



我试图打印出strcpy()的返回值,它给了我一个"访问违规读取位置";例外。

char ind[15]; 
printf("%sn", strcpy(ind, "source text"));

或使用调试语句:

char* ins = "source text";
char* dst;
dst = strcpy(ind, ins);
printf("dst = %s", dst);

Visual Studio显示ind =0x00000024ec71f448"source text"而dst =0xffffffffec71f448<读取字符串.>无法读取内存>.

dst不应该= ind吗?指向同一个地址?

Great answers, all!如果没有,则默认为"int strcpy()"当我把鼠标悬停在strcpy上时。在包含之后,它显示了"char *strcpy()"

关于地址值,我的电脑运行的是64位的Windows 10。自"int"在大多数64位平台上,DST通常为32位,DST上限为32位,伪上限为32位。

一个问题是,为了使用Visual Studio构建,您必须在所有#include .h's之上添加#define _CRT_SECURE_NO_WARNINGS以避免编译器错误。原因是VS建议使用errno_t strcpy_s(…)而不是strcpy()。但是strcpy_s()将返回如果成功的值。这使得我们的dst = 0,一个NULL指针,和#define帮助绕过它。

所有修复后,dst = ind = 0x000000249d8ff528 "source test"谢谢。

如果您未能#include <string.h>,则可能发生这种情况

没有strcpy的声明,编译器使用int strcpy()的隐式声明。这与实际的返回类型不兼容。调用函数通过一个不兼容的触发类型未定义的行为。

在这个特殊的情况下,int小于char *。这就是为什么该函数的返回值在调试器中出现截断的原因。结果是一个无效的指针值,当您试图解引用该无效指针时,您将读取一个无效的内存页,从而触发崩溃。

相关内容

  • 没有找到相关文章

最新更新