C-实现strcpy()但是Segfault

C-实现strcpy()但是Segfault,c,string,segmentation-fault,char,strcpy,C,String,Segmentation Fault,Char,Strcpy,我制作了一个strcpy()函数 在C语言中,我将单词从一个数组复制到另一个数组,而不仅仅是字母,但当我运行它时,我得到了切分错误,该怎么办 #include <stdio.h> void strcpy1(char *dest[], char source[]) { while ((*dest++ = *source++)); } int main() { char source[3][20] = { "I", "made"

我制作了一个
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;
}
#包括
void strcpy1(字符*dest[],字符源[])
{
而((*dest++=*source++));
}
int main()
{
字符源[3][20]={“I”、“made”、“this”};
char dest[3][20];
strcpy1(目的地和来源);
//打印目标数组内容
对于(int i=0;i<3;i++){
printf(“%s\n”,dest[i][20]);
}
返回0;
}

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

  • 自定义
    strcpy1
    函数的原型应为:

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

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

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

  • 在打印循环中,
    dest[i][20]
    指的是
    i
    -th字符串末尾以外的字符。您应该将字符串作为
    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;
}
#包括
void strcpy1(char*dest[],char*source[]
{
而((*dest++=*source++));
}
int main()
{
char*source[4]={“I”、“made”、“this”};
char*dest[4];
strcpy1(目的地、来源);
//打印目标数组内容
for(int i=0;dest[i];i++){
printf(“%s\n”,dest[i]);
}
返回0;
}

请注意,命名一个与标准函数具有非常不同语义的函数<;code>strcpy()

有些混乱,代码中存在多个问题:

  • 自定义
    strcpy1
    函数的原型应为:

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

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

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

  • 在打印循环中,
    dest[i][20]
    指的是
    i
    -th字符串末尾以外的字符。您应该将字符串作为
    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;
}
#包括
void strcpy1(char*dest[],char*source[]
{
而((*dest++=*source++));
}
int main()
{
char*source[4]={“I”、“made”、“this”};
char*dest[4];
strcpy1(目的地、来源);
//打印目标数组内容
for(int i=0;dest[i];i++){
printf(“%s\n”,dest[i]);
}
返回0;
}

请注意,将strcpy1命名为一个与标准函数
strcpy()
语义截然不同的函数有点让人困惑,
%s
说明符用于字符串,例如,引用字符串的第一个字符的
char*

dest[i][20]
传递给
printf
函数时,它不是
char*
。它是一个单独的
char
21
char
(有效索引为
0
-
19
,总共20个元素)

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

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

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

dest[i][20]
传递给
printf
函数时,它不是
char*
。它是一个单独的
char
21
char
(有效索引为
0
-
19
,总共20个元素)

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

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