2017-02-26 118 views
-1

我是C新手,並注意到當我運行我的代碼時,我得到了一個分段錯誤,我不知道如何解決它...任何幫助讚賞!C程序與分段錯誤

void getComment(unsigned int len, char *src) { 
    unsigned int size; 
    size = len – 4; 
    char *comment = malloc(size+1); 
    memcpy(comment, src, size); 
    printf("%s\n", comment); 
    return; 
} 
int main(int argc, char* argv[]) { 
    if (argc < 3) { 
     printf("Usage: %s <str1> <str2>\n", argv[0]); 
     return -1; 
    } 
    getComment(atoi(argv[1]), argv[2]); 
    return 0; 
} 
+2

如果'atoi'失敗,什麼是'size'? – StoryTeller

+1

你也有內存泄漏 –

+2

'size = len - 4;'←請解釋 –

回答

0

它可能有很多運行時錯誤。

  1. len -4可以返回一個負值。
  2. 您可能會錯過將傳入字符串的最後一個空字符複製到註釋中。該案例的評論將不再是字符串,當你使用%s時,它會給你錯誤或垃圾。

更好的方法將是檢查:

if (size > 0 && size <= strlen(src) { 
    memcpy(comment, src, size); 
    comment[strlen(comment)] = '\0'; 
} 
1

這是一個遠射,但你是否說明了這樣的事實,即C中的字符串是空終止的?即字符串​​確實由4個字符組成,'a', 'b', 'c' and '\0'。當您使用memcpy時,最後一個空值可能會丟失。並且printf假定字符串也是空終止的,null表示它必須停止打印輸出的地方。

C有許多函數可以與字符串一起工作,並佔用空字符。嘗試查找以下功能:strlen,strcpy(而不是memcpy)。

+1

他可能知道這一點。 ('malloc(size + 1)')我假設他期望'malloc'用零填充內存。 – Gerhardh