2009-06-03 166 views
5

在下面的代碼,行:分段故障 - 字符指針

*end = *front; 

給出段故障。我問了一個類似的問題here,但我不確定這是因爲我有兩個num的副本。請解釋爲什麼它是段錯誤的。謝謝。

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

char* getPalin(char* num); 

int main() 
{ 
    char* num = (char*)malloc(100); 

    num = "123456"; 

    printf("%s\n", getPalin(num)); 

    return 0; 
} 

char* getPalin(char* num) 
{ 
    int length = strlen(num); 

    if (length % 2 == 0) 
    { 
     char* front = num; 
     char* end = num + strlen(num) - 1; //pointer to end 

     while(front != num + (length/2)) //pointers not middle yet 
     { 
      *end = *front; 

      printf("%c", *end); 

      front++; 
      end--; 
     } 
    } 

    return num; 
} 

回答

15

這兩條線:

char* num = (char*)malloc(100); 
num = "123456"; 

具有以下效果。

第一個分配100個字節,並設置num指向那些字節。

第二個將num更改爲指向字符串「123456」,這幾乎肯定是在只讀存儲器中。

任何嘗試更改只讀內存的內容都會導致分段衝突。你需要嘗試去改變它之前的字符串複製到malloc「d num,有:

strcpy (num, "123456"); 

這就是你應該有,你目前擁有的線:

num = "123456"; 
4

使用

strncpy(num, "123456", 100); 

,而不是

num = "123456"; 
+0

對不起,不是sizeof(num),而是分配內存的大小,即100。 strncpy(num,「123456」,100); – Konstantin 2009-06-03 06:31:00

+3

OP要求解釋,但您只給出一個解決方案。並且不要忘記在strncpy之後手動添加空終止符,因爲不能保證strncpy添加它。我知道它在這個例子中是不相關的,因爲「123456」比100字節短,但是如果你決定使用strncpy而不是strcpy,請正確使用 - 避免了一個潛在的問題(緩衝區溢出),而是引入了另一個(未終止的字符串) 。 – qrdl 2009-06-03 06:38:04

1

按康斯坦丁的答案。

您已經使用malloc語句爲num分配了內存。

如果你沒有,那麼你可以逃脫:

char* num = "123456"; 

這將定義和動態分配的內存,但它最有可能被分配爲一個常數,因此只讀。

使用strncpy而不是strcpy來複制「123456」將確保超出字符串空終止符末尾的任何額外空間也會初始化爲空,只要您指定n爲100(對於您的示例)。否則,如果沒有將由malloc分配的內存初始化爲null(memset(num,0,100)),那麼可以想象,您可以跨越字符串的末尾。

哦差點忘了。建議使用strcpy_s或strncpy_s,因爲它們更安全,但對於您的代碼而言無關緊要。

0

的原因的錯誤是:

char* num = (char*)malloc(100); 

在此行您已聲明NUM作爲一個指針數組或指針到它的第一個元素不是作爲一個字符串。

num = "123456"; 

這條線,你已經使用NUM你宣佈它作爲一個字符串。這違反了分割,因此是seg故障。該preferrable(正確)的語法爲您的代碼是:

char num[100]; 
    strcpy(num,"123456"); //Even if you use num="123456"; here it would still be wrong 

OR

char* num = (char*)malloc(100); 
    strcpy(num,"123456"); 

OR

char num[100]={'1','2','3','4','5','6'}; 

任何這些會做你的工作。