2014-07-23 57 views
1

以下代碼在註釋行中出現分段錯誤錯誤時終止。該行旨在做一個字符的簡單替換。替換字符數組中的char

#include <stdio.h> 
#include <ctype.h> 

int num(char zf[], int n) { 
    int i; 

    for (i = 0; i < n; i++) { 
     // assignment = seg fault 
     if (zf[i] == ',') zf[i] = '.'; 

     if (!isdigit(zf[i]) && zf[i] != '+' && zf[i] != '-' && zf[i] != '.') { 
      return 0; 
     } 
    } 

    return 1; 
} 

int main(void) { 
    if (num("-3+3,0", 6)) { 
     printf("valid\n"); 
    } else { 
     printf("not valid\n"); 
    } 

    return 0; 
} 

我正在尋找一個完美的原因,爲什麼有一個錯誤,這是什麼解決方案? strncpy()函數?函數num的參數和數據類型不會被改變。

+7

修改字符串文字是未定義的行爲。這裏有一個類似的問題(還有更多):http://stackoverflow.com/questions/943312/segmentation-fault-char-pointer?rq=1 – chris

+2

它是[未定義的行爲來修改字符串文字] (http://stackoverflow.com/questions/19372952/modifying-a-char-const-string) –

+0

是的,字符串文字是常量。 –

回答

6

將字符串文字編譯到程序中並將其作爲字節數組存儲在二進制文件的某處。您可以在Linux中嘗試使用strings命令在二進制文件中查找字符串文字。

字符串常量最有可能存在於程序的只讀部分,這就是爲什麼它被做成未定義的行爲來修改它們。當您嘗試訪問或修改不應被訪問或修改的部分內存時,會發生分段錯誤。

+0

@TheParamagneticCroissant:我改了一點文字。 –

1

儘管在C字符串文字中有非常數字符數組的類型,但是C標準不允許改變它們。

4點相同的考慮適用於序列中的每個元素在一個 字符串文字就好像它是在一個整數字符常數

如果程序試圖修改字符串文字那麼它的行爲未定義

你應該定義主要通過以下方式

int main(void) { 
    char s[] = "-3+3,0"; 

    if (num(s, sizeof(s) - 1)) { 
     printf("valid\n"); 
    } else { 
     printf("not valid\n"); 
    } 
    return 0; 
} 
0

在這裏,在if (num("-3+3,0", 6))「3 + 3,0」存儲在只讀存儲器。所以修改它會導致分段錯誤。使用數組使"-3+3,0"存儲在堆棧中。然後我們可以修改這些值。