使用strcpy时访问冲突?

我尝试重新发明strcpy C函数,但是当我尝试运行它时,我收到此错误:

Unhandled exception at 0x00411506 in brainf%ck.exe: 0xC0000005: Access violation writing location 0x00415760. 

错误发生在*dest = *src; 线。 这是代码:

 char* strcpy(char* dest, const char* src) { char* dest2 = dest; while (*src) { *dest = *src; src++; dest++; } *dest = '\0'; return dest2; } 

编辑:哇,那很快。 这是调用代码(strcpy在mystring.c中定义):

 #include "mystring.h" #include  int main() { char* s = "hello"; char* t = "abc"; printf("%s", strcpy(s, t)); getchar(); return 0; } 

 char* s = "hello"; char* t = "abc"; printf("%s", strcpy(s, t)); 

编译器将目标缓冲区s放在只读内存中,因为它是常量。

 char s[5]; char* t = "abc"; printf("%s", strcpy(s, t)); 

应该解决这个问题。 这将在堆栈上分配目标数组,这是可写的。

显而易见的潜在问题是您的输出缓冲区没有足够的内存分配,或者您已经为dest传递了NULL。 (可能不适用于src或者它之前会失败。)

请提供一个简短但完整的程序来重现问题,我们可以检查……

这是一个在Windows上为我敲响的例子:

 #include  char* strcpy(char* dest, const char* src) { char* dest2 = dest; while (*src) { *dest = *src; src++; dest++; } *dest = '\0'; return dest2; } void main() { char *d = malloc(3); strcpy(d, "hello there this is a longish string"); } 

请注意,在这种情况下,我不得不超过实际分配的内存量,然后才能引发程序死亡 – 只是“hello”没有崩溃,尽管它肯定可能取决于编译器和执行环境的各个方面。

你的strcpy()很好。 您正在写入只读内存。 请在此处查看此说明。

如果你写了这个,你会没事的:

 #include "mystring.h" #include  int main() { char s[] = "hello"; char t[] = "abc"; printf("%s", strcpy(s, t)); getchar(); return 0; } 

在主例程中调用重新创建的strcpy例程时出现问题,字符数组:char * s =“hello”; char * t =“abc”; 将在编译时进入内存READ ONLY段。 当您尝试在常规strcpy中写入由s指向的内存时,由于它指向READ ONLY段中的某个位置,它将被捕获,并且您将获得exception。 这些字符串只读!

在调用该函数之前,确保dest已分配内存。

可能是调用者的一个问题:你检查了dest指针吗? 它指的是有效的东西还是垃圾? 除此之外,你可以做的最少的是检查空指针,比如if(!dest ||!source){/ *做什么,比如返回NULL或在函数入口上抛出exception* /}。 代码看起来不错。 不是很安全,但还可以。

有几个错误。

  1. 您没有分配可以保存复制的字符串的返回缓冲区。
  2. 在使用* src之前,您不检查src是否为null
  3. 您要在参数中获取答案并返回值。 做一个或另一个。
  4. 您可以轻松地溢出dest缓冲区。

祝好运。

什么时候代码开始执行(通常从主函数开始)。 这里的代码意味着执行的顺序。因此,当进程(执行顺序)开始时,PCB(进程控制块)被创建,pcb有关于进程的完全信息,如进程地址空间,内核栈,ofdt表这样。

在你的代码中

char * s =“你好”;
char * t =“abc”;

这就是你输入两个这样的字符串。

这里,进程地址空间的文本部分中存在的字符串(表示双引号)。 这里的文本部分是进程地址空间和文本部分中仅具有只读权限的部分之一。 这就是为什么当你试图修改源字符串/目标字符串时,我们绝不允许更改文本选项中存在的任何数据。 所以,这就是你的代码需要成为原因的原因。 希望你能理解。