2014-03-13 136 views
0

我是新的C編程,我只是瞭解指針和字符串,我知道當處理指針和字符串時,我們必須爲我們要使用動態內存分配聲明的字符串分配內存。我想計算字符串的長度,而不使用c函數庫strlen()。但爲什麼這下面的代碼並沒有給出字符串的實際長度,而是當我將*string更改爲string[50]這意味着我使用數組方式來計算,代碼工作正常,並給我字符串的真實長度。內存分配和動態內存分配

此代碼:

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

int len(char *string); 

int main(void){ 
char *string; 

string=(char *)malloc(len(string+1)); 

puts("enter string:"); 
fgets(string,sizeof(string),stdin); 

printf("length=%d\n",len(string)); 
return 0; 
} 

int len(char *string){ 
int len; 

while(*string!='\0'){ 
    string++; 
    len++; 
} 
return len-1; 
} 

這是當我運行代碼:

enter string: 
programming 
length=2 
+0

因爲你永遠不會初始化'len'。編譯(溫和)優化和*所有*合理的警告標誌(在GCC中,'-O-Wall',可能多一點)。它應該告訴你有關上面的錯誤。 – vonbrand

回答

3

您的代碼描述了雞和蛋的問題。要計算長度,您需要一個指針,分配空間&來分配需要計算長度的空間。

  1. string=(char *)malloc(len(string+1));

    在malloc()函數,你逝去的string這是一個還沒有被初始化或分配的任何內存的指針,這意味着它包含一些垃圾值。然後當你在len()中計算它的長度時,它將取消它所包含的垃圾地址,令人驚訝的是,在這裏你不會遇到段錯誤。

  2. 然後你有沒有在你的len()函數初始化變量len,它只是增加了垃圾值len包含和回報。

我跑你的代碼,它給了我一個分段錯誤因爲上面提到的問題。