2017-08-29 124 views
-1

这是我的计划:C: “zsh中:中止” 错误

#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的功能。 当我试图复制“世界!”时到“你好”,我有一个错误“zsh:abort”。当我试图复制到“你好”时没有问题。

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

+1

编译所有的警告和调试信息(例如'gcc -Wall -Wextra -g' with [GCC](http://gcc.gnu.org/))学习[使用](https:// sourceware.org/gdb/download/onlinedocs/gdb/index.html)gdb调试器 –

+0

你可以使用'valgrind'来查看内存错误 –

回答

2

当您定义具有空维度的数组并使用大括号包含的初始化程序列表初始化该数组时,数组大小由提供的初始化程序列表元素确定。

所以,你的情况,strstr2只是足够长的时间来保存串分别"Hello, ""World!"

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

while循环的非常第一次迭代,

while (src[k]) 
    { 
     dest[i + k] = src[k]; 
     //i++; 
     k++; 
    } 

索引i+k指向外边界存储器用于dest。只要您尝试使用索引访问内存位置,就会面临UB。

您需要确保目标有足够的空间来保存连接的结果。为此,您可以选择两种方法之一:

  • 静态定义更大的数组大小并将其用作目标。在这种情况下,您可以随时查看实际大小与已用大小,因为这是一个字符型数组,旨在用作字符串提示:sizeof vs strlen())。
  • 您可以使用指针,使用内存分配器功能根据需要分配一定数量的内存和realloc()