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

时间:2017-04-16 12:39:30

标签: c pointers

这是一个将一个指针复制到另一个指针的代码。 错误是分段错误(核心转储)

#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);
}

3 个答案:

答案 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链接。因为这个问题表明你是一名新手程序员。继续工作。