2017-08-06 29 views
1

計算字符串長度的函數;我認爲這裏的邏輯是正確的:找到字符串長度時的分割錯誤

int strlength(char *s) 
{ 
int count=0; 
while(*s!='\0') 
{ 
    count++; 
    s++; 
} 
    return count; 
} 


int main(void) { 
    char *s; 
    int length; 
    printf("enter your string "); 
    scanf("%s",s); 
    length = strlength(s); 
    printf("string length:%d",length); 
    return 0; 
} 

我在這裏正確地把字符串分配給它嗎?任何人都可以解釋爲什麼我在這裏遇到分段錯誤?

回答

5

您的s必須指向某些東西。下面是分配128個字節的例子:

s = malloc(128); 

一定要釋放內存一旦你用它做:

free(s); 

請注意,您必須限制多少可以讀來自用戶。

scanf("%127s", s); 

我爲NUL終止符留下了一個額外的字節。

3

main()函數的第二行是聲明一個指針。但是,該指針從未初始化爲指向該程序擁有的某個內存塊。

建議使用其中一個堆分配函數(malloc,calloc,realloc)來初始化該指針。

使用未初始化的指針是未定義的行爲,並且(如您所見)導致seg故障事件。

調用任何scanf()系列的功能時

  1. 總是檢查返回值(不是參數值),以確保手術成功。
  2. 使用'%s'輸入/格式說明符時,總是包含一個MAX CHARACTERS修飾符,它比輸入緩衝區的長度小1,以避免任何緩衝區溢出。這種溢出行爲並未定義爲 ,並可能導致seg故障事件。