这个有错误的C代码有什么问题?
它是一种将一个指针复制到另一个指针的代码。 错误是分段错误(核心转储)这个有错误的C代码有什么问题?,c,pointers,C,Pointers,它是一种将一个指针复制到另一个指针的代码。 错误是分段错误(核心转储) #包括 字符strcp(字符*,字符*); int main() { char*p=“string”,*q; printf(“%s”,p); strcp(p,q); printf(“%s”,q); 返回0; } 字符strcp(字符*p,字符*q) { int i; 对于(i=0;*(p+i)!='\0';i++) *(p+i)=*(q+i); } p指向的是文本,而文本是只读的。禁止尝试向其复制任何内容(并导致分段错误)
#包括
字符strcp(字符*,字符*);
int main()
{
char*p=“string”,*q;
printf(“%s”,p);
strcp(p,q);
printf(“%s”,q);
返回0;
}
字符strcp(字符*p,字符*q)
{
int i;
对于(i=0;*(p+i)!='\0';i++)
*(p+i)=*(q+i);
}
p
指向的是文本,而文本是只读的。禁止尝试向其复制任何内容(并导致分段错误)
…和
q
未初始化,这是seg故障的另一个可能原因。此算法的问题在于它对指针的隐含假设:char*q
不是字符串,而是指向字符的指针。如果分配空间并在其中放置以null结尾的字符序列,但代码没有这样做,则可以将其视为字符串
您可以使用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
}
char strcp(char*p,char*q)
{
int i;
对于(i=0;*(q+i)!='\0';i++)/,其他答案表明问题以char*p=“string”,*q;
开始。
“字符串”
编译为等效的:
const char foo[7]={'s','t','r','i','n','g','\0'};
正如您可能在代码中进一步看到的,您试图将数据复制到常量
a\rray。这是非法的
但是你在玩C,你有一个const char foo[]
到一个char*p
,就在那里
C不是因为它与硬件上的实际指令紧密耦合。类型不再存在的地方,只是宽度。但这是另一个主题
*这不是唯一的缺陷。我添加了一些解释性的wiki链接。因为问题表明你是一个新手程序员。继续工作。q
指向垃圾。你的strcp命令将字符从q复制到p。这是你想要的吗?是的,但它会给出一个错误你确定不想从p复制到q吗?即使我写了*(q+i)=*(p+i)它给出了相同的错误..然后strcpy(q,p);
如果我进行上述更改,它将打印*p值2times@Satya这不是您的目标吗?当您打印p
,然后将其复制到q
,然后打印q
,您会看到p
的内容被打印了两次。如果您想看到打印输出之间的一些分隔,请添加%s\n
转到下一行。@PaulOgilvie不是真的,他正在按自己的意图使用它(与标准相反)。
char *p="string";
char *q=malloc(strlen(p)+1);
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
}