我试图打印出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!
如果没有
关于地址值,我的电脑运行的是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 *
。这就是为什么该函数的返回值在调试器中出现截断的原因。结果是一个无效的指针值,当您试图解引用该无效指针时,您将读取一个无效的内存页,从而触发崩溃。