Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个有错误的C代码有什么问题?_C_Pointers - Fatal编程技术网

这个有错误的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
}