2017-08-29 147 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()