下面是我的程序:
#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;
}它是strcat函数的实现。当我试图复制“世界!”对于"Hello,“我有一个错误"zsh: abort”。当我尝试复制到"Hello“时没有问题。
如何处理此错误?为什么这个逗号会导致这个问题?
发布于 2017-08-29 18:52:32
当您定义一个空维的数组并用大括号括起的初始值设定项列表对其进行初始化时,数组的大小由提供的初始值设定项列表元素决定。
因此,在您的示例中,str和str2的长度仅为,足以分别容纳字符串"Hello, "和"World!"。
所以,这里的问题是,目标缓冲区(作为ft_strcat()的第一个参数传递)绝对没有空间来容纳连接的结果。您正在访问超出限制的内存,从而导致undefined behavior。
在while循环的第一次迭代中,
while (src[k])
{
dest[i + k] = src[k];
//i++;
k++;
}索引i+k指向dest的越界内存。只要你尝试使用索引来访问内存位置,你就会遇到UB。
您需要确保目的地有足够的剩余空间来保存连接的结果。为此,您可以使用以下两种方法中的任何一种
strlen()).sizeof可以使用指针,使用内存分配器函数根据需要分配一定数量的内存和realloc()。https://stackoverflow.com/questions/45937212
复制相似问题