2009-08-13 139 views
1

我试图重塑strcpy的C函数,但是当我尝试运行它,我得到这个错误:使用strcpy时访问冲突?

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 <stdio.h> 

int main() { 
    char* s = "hello"; 
    char* t = "abc"; 
    printf("%s", strcpy(s, t)); 
    getchar(); 
    return 0; 
} 
+3

你打电话给你的实施?该代码将会有所帮助。 – Jason 2009-08-13 21:18:58

+1

男人,那是一堆快速回答。欢迎来到溢出缓冲区的世界。 :) – Craig 2009-08-13 21:22:27

+0

你是怎么称呼它的? – 2009-08-13 21:23:08

回答

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

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

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

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

+0

谢谢。 (15个字符) – Javier 2009-08-13 21:37:30

2

之前它传递给你的strcpy什么才做的DEST分配?可能性是这个问题。

+1

没关系。就像迈克尔写的一样。 stuf是只读部分的地方。你可以在gcc AFAIKT中改变它,但我认为改变这是一个非常糟糕的主意 – Friedrich 2009-10-21 16:00:18

7

一个明显的潜在问题是您的输出缓冲区没有分配足够的内存,或者您在dest中传递NULL值。 (可能不是src或者它会失败过就行了。)

请给一个简短而完整的程序来重现问题,我们可以检查...

这里的肚里爆炸为例我在Windows上:

#include <stdlib.h> 

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"); 
} 

注意,在这种情况下,我有一个公平的量超过实际分配的内存之前,我可能会引发程序死 - 只是“你好”没出事,但它肯定能取决于编译器和执行环境的各个方面。

+1

为什么在所有编译的名字你是否返回dest2?调用代码不关心返回值,“输入”参数“d”保持高位并且干燥。 – Craig 2009-08-13 21:28:38

+0

我只是从OP复制代码... – 2009-08-13 21:30:37

+0

异常文本说这是一个写访问异常的地址是接近的代码地址 - 所以dest是一个全局或常量在可执行文件 – Michael 2009-08-13 21:34:41

0

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

0

可能是来电者的问题:您是否检查了dest指针?它指向有效的东西还是仅仅是垃圾?除此之外,你至少可以做的是检查空指针,如if(!dest ||!source){/ *在函数入口处做某事,如返回NULL或抛出异常* /}。代码看起来不错。不是很安全,但确定。

0

有几个错误。

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

祝你好运。

+0

这些“错误”中没有一个适用于OP的代码。 – hughdbrown 2009-08-13 21:35:13

3

你的strcpy()很好。您正在写入只读内存。请参阅此说明here

如果你这样写,你会被罚款:

#include "mystring.h" 
#include <stdio.h> 

int main() { 
    char s[] = "hello"; 
    char t[] = "abc"; 
    printf("%s", strcpy(s, t)); 
    getchar(); 
    return 0; 
} 
1

没有与主程序你改造的strcpy常规,既字符数组的话的问题: 的char * s =“你好“; char * t =“abc”; 将在编译时落入内存READ ONLY段。当你试图在例程strcpy中写入由s指向的内存时,并且由于它指向了READ ONLY段中的一个位置,它将被捕获,并且你会得到一个异常。这些字符串是只读的!

0

有史以来的代码开始执行(通常从主函数开始)。这里的代码表示执行顺序。因此,当进程(执行序列)启动时,PCB(进程控制块)被创建,pcb完成对进程地址空间,内核堆栈,dt表等进程的信息化。

在你的代码

char* s = "hello";
char* t = "abc";

这两个字符串这样的您所采取的投入。

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