这个有错误的C代码有什么问题?

问题描述:

它是将一个指针复制到另一个指针的代码。 错误是分割错误(内核倾倒)这个有错误的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

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

什么p点是文字和文字是只读的。试图将任何内容复制到它是被禁止的(并导致分段错误)。

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

该算法的问题是一个隐含的假设,它使得关于指针: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

正如其他答案已经表明问题开始*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,因为它与硬件上的实际指令紧密耦合。类型不再存在,只是宽度。但那是另一个话题。

* 这不是唯一的缺陷。我扔了几个解释性维基链接。因为这个问题表明你是一个新手程序员。继续工作。