这是一个将一个指针复制到另一个指针的代码。 错误是分段错误(核心转储)
#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);
}
答案 0 :(得分:2)
char *p="string"...
strcp(p,q);
p
指向的是文字,文字是只读的。试图将任何内容复制到它是被禁止的(并导致分段错误)。
...并且q
未初始化,这是seg故障的另一个可能原因。
答案 1 :(得分:0)
这个算法的问题是它对指针的隐含假设:char *q
不是一个字符串,它是一个指向字符的指针。如果你分配空格并将一个以空字符结尾的字符序列放入其中,它可以被视为string
,但是你的代码不会这样做。
您可以使用q
将空间分配给malloc
,如下所示:
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
}
答案 2 :(得分:-1)
正如其他答案表明问题以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
var arr = [["Ashley","2017-01-10",80],
["Ashley","2017-02-10",75],
["Ashley","2017-03-10",85],
["Clara","2017-01-10",90],
["Clara","2017-02-10",82]];
,initialization期间。
C不是type safe,因为它与硬件上的实际指令紧密耦合。类型不再存在的地方,只是宽度。但那是另一个话题。
* 这不是唯一的缺陷。我抛出了一些解释性的wiki链接。因为这个问题表明你是一名新手程序员。继续工作。