C: "zsh: abort" 错误
C: "zsh: abort" error
这是我的程序:
#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] = '[=11=]';
return (dest);
}
int main(){
//ft_strcat
char str[] = "Hello, ";
char str2[] = "World!";
printf("%s", ft_strcat(str, str2));
return 0;
}
它正在实现 strcat 函数。
当我尝试将 "World!" 复制到 "Hello, " 时,出现错误 "zsh: abort"。当我尝试复制到 "Hello ".
时没有问题
我该如何处理这个错误?为什么这个逗号会导致这个问题?
当您定义一个空维数组并用大括号括起来的初始化列表对其进行初始化时,数组的大小由提供的初始化列表元素决定。
因此,在您的情况下,str
和 str2
刚好 足以容纳 字符串 "Hello, "
和 "World!"
。
所以,这里的问题是,目标缓冲区(作为 ft_strcat()
的第一个参数传递)绝对没有 space 来保存 连接的 结果。您正在访问超出限制的内存,从而导致 undefined behavior.
在 while
循环的第一次迭代中,
while (src[k])
{
dest[i + k] = src[k];
//i++;
k++;
}
索引 i+k
指向 dest
的超出内存限制。刚尝试使用索引访问内存位置,就面临UB
您需要确保目的地有足够的 space 剩余空间来保存串联结果。为此,您可以采用两种方法之一
- 静态定义更大的数组大小并将其用作目标。在这种情况下,您始终可以轻松检查实际大小与已经使用的大小,因为这是一个字符类型数组,旨在用作 string(提示:
sizeof
对比 strlen()
).
- 您可以利用指针,使用内存分配器函数分配一定数量的内存,并根据需要
realloc()
。
这是我的程序:
#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] = '[=11=]';
return (dest);
}
int main(){
//ft_strcat
char str[] = "Hello, ";
char str2[] = "World!";
printf("%s", ft_strcat(str, str2));
return 0;
}
它正在实现 strcat 函数。 当我尝试将 "World!" 复制到 "Hello, " 时,出现错误 "zsh: abort"。当我尝试复制到 "Hello ".
时没有问题我该如何处理这个错误?为什么这个逗号会导致这个问题?
当您定义一个空维数组并用大括号括起来的初始化列表对其进行初始化时,数组的大小由提供的初始化列表元素决定。
因此,在您的情况下,str
和 str2
刚好 足以容纳 字符串 "Hello, "
和 "World!"
。
所以,这里的问题是,目标缓冲区(作为 ft_strcat()
的第一个参数传递)绝对没有 space 来保存 连接的 结果。您正在访问超出限制的内存,从而导致 undefined behavior.
在 while
循环的第一次迭代中,
while (src[k])
{
dest[i + k] = src[k];
//i++;
k++;
}
索引 i+k
指向 dest
的超出内存限制。刚尝试使用索引访问内存位置,就面临UB
您需要确保目的地有足够的 space 剩余空间来保存串联结果。为此,您可以采用两种方法之一
- 静态定义更大的数组大小并将其用作目标。在这种情况下,您始终可以轻松检查实际大小与已经使用的大小,因为这是一个字符类型数组,旨在用作 string(提示:
sizeof
对比strlen()
). - 您可以利用指针,使用内存分配器函数分配一定数量的内存,并根据需要
realloc()
。