2017-06-20 37 views
-5
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() 
{ 
    char *ptr1="abcdef"; 
    ptr1 = ptr1 +(strlen(ptr1)-1); 

    printf("%c",--*ptr1--); 
    printf("%c",--*--ptr1); 
    printf("%c",--*(ptr1--)); 
    printf("%c",--*(--ptr1)); 
    printf("%c",*ptr1); 

    return 0; 
} 

上面的代碼會引發分段錯誤錯誤。有人能幫我理解背後的原因嗎?如何在C代碼中找到分段錯誤?

+1

原因是蹩腳的,不可讀的代碼,可能會引發未定義的行爲。 –

+0

順便說一句,它甚至不會編譯。 –

+0

請解釋我breafly –

回答

2

假設有程序中的一個錯字,你確實有這樣的:而不是

char *ptr1 = "abcdef"; 
//  ^<<<< 

char *ptr = "abcdef"; 

您試圖修改文本字符串這將產生不確定的行爲,通常分段故障。

這裏是一個很小的程序,觸發排序段錯誤的你已經有了:

int main() 
{ 
    char *string = "abcdef"; 
    *string = 'X'; 
} 

你可能是爲了做到這一點:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char string[] = "abcdef"; 
    char *ptr1 = string + (strlen(string) - 1); 

    printf("%c", --*ptr1--); 
    printf("%c", --*--ptr1); 
    printf("%c", --*(ptr1--)); 
    printf("%c", --*(--ptr1)); 
    printf("%c", ptr1); 

    return 0; 
} 

但仍存在問題,在此代碼:

  1. 構建像--*ptr1----*--ptr1是毫無意義的。甚至可能還有未定義的行爲(不確定)。
  2. printf("%c", ptr1);產生未定義的行爲,因爲格式說明符%cptr1的類型不匹配。這是正確的:printf("%p", ptr1);
+0

對不起,錯別字。我現在糾正了代碼。這個問題在編碼拼圖測試中被問到,答案中的任何選項都沒有提到任何錯誤。以下是選項: a)ecbaa b)edcbb c)fedaa d)Ecdbb –

+0

這個難題是由不明白未定義行爲的人編寫的。 –

+0

你能否解釋一下undefined行爲breafly –