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
您需要确保目标有足够的空间来保存连接的结果。为此,您可以使用两种方法中的任何一种
- 静态定义更大的数组大小并将其用作目标。在本例中,您始终可以轻松地检查实际大小与已使用的大小,因为这是一个用作字符串的字符类型数组(提示:
vssizeof
)strlen()
- 您可以使用指针,使用内存分配器函数分配一定数量的内存,并根据需要分配
realloc()
gcc-Wall-Wextra-g
with)编译。学习gdb
调试器。您可以使用valgrind
查看内存错误