2017-04-16 105 views
-3

它是將一個指針複製到另一個指針的代碼。 錯誤是分割錯誤(內核傾倒)這個有錯誤的C代碼有什麼問題?

#include<stdio.h> 
char strcp(char *,char *); 
int main() 
{ 
char *p="string",*q; 
printf("%s",p); 
strcp(p,q); 
printf("%s",q); 
return 0; 
} 
char strcp(char *p,char *q) 
{ 
int i; 
for(i=0;*(p+i)!='\0';i++) 
*(p+i)=*(q+i); 
} 
+2

'q'指向垃圾。 – tkausl

+2

您的strcp命令將字符從q複製到p。這是你想要的嗎? – ilent2

+0

是的,但它給出了一個錯誤 – Satya

回答

2
char *p="string"... 
strcp(p,q); 

什麼p點是文字和文字是隻讀的。試圖將任何內容複製到它是被禁止的(並導致分段錯誤)。

...和q未初始化,是導致seg故障的另一個可能原因。

0

該算法的問題是一個隱含的假設,它使得關於指針:char *q而不是一個字符串,它是一個指向字符的指針。如果您分配空間並將空字符結尾的字符序列放入其中,但您的代碼不會執行此操作,則可將其視爲string

您可以malloc空間分配給q,像這樣:

char *p="string"; 
char *q=malloc(strlen(p)+1); 

此外,您的strcpy版本讀取錯誤的指針空終止,並且不空終止複製的字符串:

char strcp(char *p, char *q) 
{ 
    int i; 
    for(i=0;*(q+i)!='\0';i++) // <<== Fix this 
     *(p+i)=*(q+i); 
    *(p+i) = '\0'; // <<== Add this line 
} 
+1

..然後'strcpy(q,p);' –

+0

如果我做了上述更改,它將打印* p值2次 – Satya

+0

@Satya是不是你的目標?當你打印'p'時,你將一份拷貝到'q'中,然後打印'q',你會看到打印兩次'p'的內容。如果你想在打印輸出之間看到一些分隔,可以加''%s \ n「'去下一行。 – dasblinkenlight

-1

正如其他答案已經表明問題開始*char *p="string",*q;。 的Literal"string"編譯成等價的:

const char foo[7] = {'s','t','r','i','n','g','\0'};why *\0

正如你可能會進一步看到你的代碼你試圖將數據複製到一個const一個\ rray。這是違法的。

但是你玩C,你有implicitly castedconst char foo[]char *p,在那裏initialization期間。

C不是type safe,因爲它與硬件上的實際指令緊密耦合。類型不再存在,只是寬度。但那是另一個話題。

* 這不是唯一的缺陷。我扔了幾個解釋性維基鏈接。因爲這個問題表明你是一個新手程序員。繼續工作。