这个有错误的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);
}
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
}
..然后'strcpy(q,p);' –
如果我做了上述更改,它将打印* p值2次 – Satya
@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 casted的const char foo[]
到char *p
,在那里initialization期间。
C不是type safe,因为它与硬件上的实际指令紧密耦合。类型不再存在,只是宽度。但那是另一个话题。
* 这不是唯一的缺陷。我扔了几个解释性维基链接。因为这个问题表明你是一个新手程序员。继续工作。
'q'指向垃圾。 – tkausl
您的strcp命令将字符从q复制到p。这是你想要的吗? – ilent2
是的,但它给出了一个错误 – Satya