2013-07-18 118 views
1

我寫了一段代碼。這看起來如下。分段故障運行時錯誤

#include<stdio.h> 

#include<string.h> 

int do_print2(char *q[]); 
int main() 
{ 

    char *p[]={"pointervaule","NAM", "JAM", "CALM"}; 
    do_print2(p); 
    return 1; 
} 

int do_print2(char *p[]) 
{ 
    printf("this is print1 char *p \n"); 
    strcat(p[0],"added"); 
    printf("%s\n", (p[0])); 
    return 1; 

} 

編譯後,我試圖運行它,我得到分段錯誤。幫助我瞭解那個錯誤的原因是什麼。預先感謝。

回答

4

在您的代碼中:strcat(p[0],"added");嘗試在C中非法的只讀內存上進行寫操作。因爲p[0]指向一個常量字符串。

不是p是指向char數組的指針,但不是2維char數組。

閱讀:Difference between char* str[] and char str[][] and how both stores in memory?答案與圖表和代碼示例,以更好地理解它。

+0

HII Grijesh肖漢,首先非常感謝全幫我修復這個錯誤,和U可以讓我知道一本書或者一些讓我在處理指針和字符串時感覺舒適的物質。 (任何教程?) –

+0

@SrinivasThanneeru一個巨大的列表:[The Definitive C Book Guide and List](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)以及for [指針](http://stackoverflow.com/questions/tagged/pointers) –

+0

@SrinivasThanneeru如果需要用C編寫代碼,他/她應定期閱讀[FAQ](http://c-faq.com/) –

3

操作系統表示C字符串位於對象的讀取部分(即受保護而不能寫入)。

由於歷史原因,「bla bla」實際上是一個const char * const數據類型,但是可以在C編譯器的眼中獲得一些十幾歲的相互依賴關係。但校長(OS)的寬容度較差,並且驅逐走廊中的這類代碼。 (該陳述中有多少個隱喻)。

+0

在'C'中,字符串的類型是'char [N]'。它是一個數組,不是指針,但是類型中沒有'const'。用'gcc'你可以強制編譯器把字符串作爲''const char *''來處理。選項'-Wwrite-strings'就可以做到這一點。雖然它不是**標準C,但使代碼更健壯是非常有用的。 –

+0

我的意思是它在代碼的讀取部分,即不在堆棧中。 –

+0

好吧,只是想通知有關這一點,有些人不知道這一點,也混淆了C和C++之間(因爲在C++字符串文字是'const char *')。順便說一句,你在第二段有很好的線條。 –

1

你不能寫入只讀存儲器,更好的方式來做到這一點:

#include<stdio.h> 

#include<string.h> 

int do_print2(char q[][20]); 
int main() 
{ 
    char p[4][20] = {{0}, {0}, {0}, {0}}; 
    strcat(p[0],"pointervaule"); 
    strcat(p[1],"NAM"); 
    strcat(p[2],"JAM"); 
    strcat(p[3],"CALM"); 
    do_print2(p); 
    return 1; 
} 

int do_print2(char p[][20]) 
{ 
    printf("this is print1 char *p \n"); 
    strcat(p[0],"added"); 
    printf("%s\n", (p[0])); 
    return 1; 

}