C - 实现 strcpy() 但出现段错误

C -Implementing strcpy() But Segfault

我做了一个strcpy()函数 在 C 中,我将单词从一个数组复制到另一个数组,而不仅仅是字母,但是当我 运行 它时,我遇到了分段错误怎么办?

#include <stdio.h>

void strcpy1(char *dest[], char source[])
{
    while ((*dest++ = *source++));
}

int main()
{
    char source[3][20] = { "I", "made", "this" };
    char dest[3][20];

    strcpy1(&dest, source);
    
    //printing destination array contents   
    for (int i = 0; i < 3; i++) {
        printf("%s\n", dest[i][20]);
    }

    return 0;
}

您的代码中存在多个问题:

  • 您的自定义 strcpy1 函数的原型应该是:

    void strcpy1(char *dest[], char *source[]);
    
  • 数组 sourcedest 是二维 char 数组:与 strcpy1 期望的类型非常不同,后者是指针数组.将定义更改为:

     char *source[4] = { "I", "made", "this" };
     char *dest[4];
    
  • 您应该将目标数组作为 dest 而不是 &dest

  • 源数组应该有一个NULL指针终止符:它应该被定义为至少4的长度。目标数组也是如此。

  • 在打印循环中 dest[i][20] 指的是超出第 i 个字符串末尾的字符。您应该将字符串作为 dest[i].

    传递

这是修改后的版本:

#include <stdio.h>

void strcpy1(char *dest[], char *source[])
{
    while ((*dest++ = *source++));
}

int main()
{
    char *source[4] = { "I", "made", "this" };
    char *dest[4];

    strcpy1(dest, source);
    
    //printing destination array contents   
    for (int i = 0; dest[i]; i++) {
        printf("%s\n", dest[i]);
    }

    return 0;
}

请注意,命名一个与标准函数 strcpy() 语义截然不同的函数 strcpy1 有点令人困惑。

%s 说明符用于字符串,例如,char* 指的是字符串的第一个字符。

当您将 dest[i][20] 传递给 printf 函数时,它不是 char*。它是单个char21stchar(有效索引为0-19,共20个元素) .

所以它是一个数组越界索引,而且,不是 printf 期望的 char*

printf("%s\n", dest[i][20]);