使用strcpy时访问冲突?

时间:2009-08-13 21:17:00

标签: c 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 <stdio.h>

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

8 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分: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");
}

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

答案 2 :(得分: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;
}

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

有几个错误。

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

答案 7 :(得分:0)

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

代码

  

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

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

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