我尝试重新发明 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;
}
有帮助吗?

解决方案

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

编译器放置在您的目标缓冲区,S,在只读存储器,因为它是一个常数。

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

应该解决这个问题。此分配堆栈,其是可写在目标阵列。

其他提示

在明显的潜在问题是,你的输出缓冲区没有足够的内存分配,或者你已经在NULL过去了dest。 (可能不用于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");
}

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

您的strcpy()是好的。您写这封信是只读存储器。请参见本说明书这里

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

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

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

有与在主程序中,两个字符数组呼叫您的改造的strcpy例程的一个问题:     字符* S = “你好”;     字符* T = “ABC”; 将土地读入内存在编译时ONLY段。当你正在尝试写入内存由s在日常的strcpy指出,既然它指向的位置在只读段,它会被抓住,你会得到一个异常。这些字符串只读的!

确认DEST有它的内存调用该函数之前进行分配。

可能与呼叫者的一个问题:你检查的 DEST 的指针?它是否指向有效的东西或者只是垃圾?除此之外,你可以做最不重要的是检查空指针,就像如果(!DEST ||!源){/ *做一些事情,比如返回null或抛出一个异常* /}在函数入口。代码看起来OK。不是很安全,但确定。

有几个错误。

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

祝你好运。

当曾经执行码开始(generaly它从主功能开始)。这里的代码装置execution.so的序列,过程(执行的序列)开始时,PCB(进程控制块)被创建,其具有约等进程的地址空间,栈籽粒,OFDT表这样的过程完成infromation在pcb

在代码

  

字符* S = “你好”;结果,       字符* T = “ABC”;

这是你已经采取了两个字符串输入这样的。什么

在此,其存在于进程的地址空间的文本部分中的字符串(这意味着双引号)。这里文本段是其存在于只具有只读权限的进程的地址空间和文本部分中的部分中的所述一个。这就是为什么当你试图修改源串/目标字符串,我们必须不允许的改变的任何数据出现在文本相间螺旋缠绕制成。所以,这是你的代码的原因,你需要保持谨慎。希望你能理解。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top