2010-02-16 26 views
0

幫我解決指針上的2個問題:一些「預測的產出」的指針

1)請告訴我爲什麼我得到「分段錯誤」,當我運行下面的代碼片段

main() 
{ 
    char *str1 = "united"; 
    char *str2 ="front"; 
    char *str3; 
    str3 = strcat(str1,str2); 
    printf("\n%s",str3); 
} 

2 )爲什麼我在下面的代碼中得不到輸出:

main() 
{ 
    char str[10] = {0,0,0,0,0,0,0,0,0,0}; 
    char *s; 
    int i; 
    s = str; 
    for(i=0 ; i<=9;i++) 
    { 
     if(*s) 
      printf("%c",*s); 
     s++; 
    } 
} 

謝謝你。

+0

非常感謝所有:) – Supereme 2010-02-16 12:48:05

回答

3
  1. 你應該回顧一下如何strcat作品。它將嘗試在指針的末尾重寫內存,然後將目標指針返回給您。編譯器僅在str1中分配了足夠的內存以保存「united \ 0」(7個字符),您正在嘗試填充「unitedfront \ 0」(12個字符)。 str1指向只有7個分配的字符,所以沒有空間讓串接發生。

  2. *s將解除引用s,有效地爲您提供數組中的第一個字符。這是0,將評估爲false。

+2

此外,對於問題1,str1可能會指向一個恆定的數據段,根本不允許任何寫入。 – tomlogic 2010-02-16 05:32:02

2

1)編譯成類似:

const char _str1[7] = "united"; 
const char _str2[6] ="front"; 
char *str1 = _str1; 
char *str2 = _str2; 
strcat(str1,str2); 
str3 = str1; 

str1指向的緩衝這正好是7個字節長,並填充有6個字符。 strcat將另外5個字節放入該緩衝區。 7個字節不能包含11個字符。 C沒有魔法!如果你沒有明確地分配空間的東西,沒有人會這樣做......

2)不打印任何東西。它遍歷一個數組,其中每個元素都是0.然後測試當前項(*s)是否不是0(if(*s)),如果是,則將該項打印爲字符。但是,由於該項目始終爲0,因此始終無法測試。

1

問題2,想想下面這行做了什麼:

if(*s)