首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C:"zsh: abort“错误

C:"zsh: abort“错误
EN

Stack Overflow用户
提问于 2017-08-29 18:51:18
回答 1查看 10.6K关注 0票数 2

下面是我的程序:

代码语言:javascript
复制
#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“时没有问题。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 18:52:32

当您定义一个空维的数组并用大括号括起的初始值设定项列表对其进行初始化时,数组的大小由提供的初始值设定项列表元素决定。

因此,在您的示例中,strstr2长度仅为,足以分别容纳字符串"Hello, ""World!"

所以,这里的问题是,目标缓冲区(作为ft_strcat()的第一个参数传递)绝对没有空间来容纳连接的结果。您正在访问超出限制的内存,从而导致undefined behavior

while循环的第一次迭代中,

代码语言:javascript
复制
while (src[k])
    {
        dest[i + k] = src[k];
        //i++;
        k++;
    }

索引i+k指向dest的越界内存。只要你尝试使用索引来访问内存位置,你就会遇到UB。

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

  • 静态地定义了一个更大的数组大小,并将其用作目标。在这种情况下,您始终可以轻松地检查实际大小与已经使用的大小,因为这是一个字符类型数组,将用作字符串(提示:strlen()).
  • You和sizeof可以使用指针,使用内存分配器函数根据需要分配一定数量的内存和realloc()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45937212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档