C:“;zsh:abort";错误

C:“;zsh:abort";错误,c,arrays,strcat,C,Arrays,Strcat,以下是我的节目: #include <stdio.h> char *ft_strcat(char *dest, char *src) { int i; int k; i = 0; k = 0; while (dest[i]) i++; while (src[k]) { dest[i + k] = src[k]; //i++; k++; }

以下是我的节目:

#include <stdio.h>

char    *ft_strcat(char *dest, char *src)
{
    int i;
    int k;

    i = 0;
    k = 0;
    while (dest[i])
        i++;
    while (src[k])
    {
        dest[i + k] = src[k];
        //i++;
        k++;
    }
    dest[i + k] = '\0';
    return (dest);
}

int main(){
    //ft_strcat
    char str[] = "Hello, ";
    char str2[] = "World!";
    printf("%s", ft_strcat(str, str2));
    return 0;
}
#包括
char*ft_strcat(char*dest,char*src)
{
int i;
int k;
i=0;
k=0;
while(dest[i])
i++;
while(src[k])
{
dest[i+k]=src[k];
//i++;
k++;
}
dest[i+k]='\0';
返回(dest);
}
int main(){
//英国皇家空军
char str[]=“你好,”;
char str2[]=“世界!”;
printf(“%s”,ft_strcat(str,str2));
返回0;
}
它是strcat功能的实现。 当我试图将“World!”复制到“Hello”时,出现了一个错误“zsh:abort”。当我试图复制到“你好”时,没有问题


如何处理此错误?为什么这个逗号会导致这个问题?

当您定义一个维度为空的数组,并使用大括号内的初始值设定项列表初始化该数组时,数组的大小由提供的初始值设定项列表元素决定

因此,在您的例子中,
str
str2
的长度刚好可以分别容纳字符串
“Hello”,
“World!”

因此,这里的问题是,目标缓冲区(作为
ft\u strcat()
的第一个参数传递)绝对没有空间来保存连接的结果。您正在访问超出限制的内存,因此导致

while
循环的第一次迭代中

while (src[k])
    {
        dest[i + k] = src[k];
        //i++;
        k++;
    }
索引
i+k
指向
dest
的越界内存。在您尝试使用索引访问内存位置之前,您就面临着UB

您需要确保目标有足够的空间来保存连接的结果。为此,您可以使用两种方法中的任何一种

  • 静态定义更大的数组大小并将其用作目标。在本例中,您始终可以轻松地检查实际大小与已使用的大小,因为这是一个用作字符串的字符类型数组(提示:
    sizeof
    vs
    strlen()
  • 您可以使用指针,使用内存分配器函数分配一定数量的内存,并根据需要分配
    realloc()

使用所有警告和调试信息(例如,
gcc-Wall-Wextra-g
with)编译。学习
gdb
调试器。您可以使用
valgrind
查看内存错误