考虑下面的代码,它可以很好地复制字符串
#include<stdio.h>
void strcp(char *s1, char *s2);
int main() {
char s1[]="Hai, I am a good boy"; //1
char s2[]="Really I am a good boy"; //2
strcp(s1,s2);
printf("%s",s1);
return 0;
}
void strcp(char *s1, char *s2) {
while(*s1++=*s2++);
}
如果我想将s1, s2
声明为main()
内的char指针,我必须做出哪些更改?
char *s1="Hai, I am a good boy"; //1
char *s2="Really I am a good boy"; //2
我尝试复制指针值,如下所示
void strcp(char *s1, char *s2) {
s1=s2;
}
但它没有用。
答案 0 :(得分:2)
void strcp(char **s1, char **s2) {
*s1=*s2;
}
但它不会复制任何内容。在此之后s1&amp; main中的s2将指向相同的内存位置。
答案 1 :(得分:1)
这两个版本,即使是你声称它工作正常的版本,也会产生未定义的行为,这可能会在分段错误中变得明显。
通常,访问存储器要求所寻址的存储器有效,即正确分配。对于写入内存尤其如此,就像任何类型的strcpy
一样。
在第一种情况下,您定义一个变量char s1[]="Hai, I am a good boy"
,它隐含地保留一个大约21个字节的内存块并复制提供给它的字符串文字。如果现在将另一个字符串复制到s1
,而另一个字符串长度超过21个字节,则实际上会解决未为s1
保留的内存,从而产生未定义的行为。
在第二种情况下,当您定义变量char *s1="Hai, I am a good boy"
时,不会保留您可以写入的内存块,但s1
将指向不可写数据段中的内存块文字"Hai, I am a good boy"
所在的位置。将某些内容复制到此地址会再次产生未定义的行为,但原因不同。
为s1
分配内存,例如使用malloc
,然后将内容复制到其中。
答案 2 :(得分:1)
首先,您无法修改文字字符串,即const。 第二,你的函数strcp()并不关心如果你传递一个指向字符或字符数组的指针,它应该适用于两种情况。当你只键入s1时,数组转换为指向char的指针到数组的第一个元素。
s1 - &gt;(char *)&amp; s1 [0]
由于你无法修改文字字符串,你可以做的只是切换指针:
void strcp(char **s1, char **s2) {
char *temp = *s1;
*s1 = *s2;
*s2 = temp;
}
答案 3 :(得分:-2)
#include<stdio.h>
void strcp(char *s1, char *s2);
int main() {
char *s1 = "Hi, I am a good boy"; //1
char *s2 = "Really!! I am a good boy"; //2
strcp(&s1,&s2); //Pass Address to function
printf("s1 = %s", s1);
printf("\ns2 = %s", s2);
return 0;
}
/*
* This method takes pointer address as arguments and simply swap the address
* pointing to string (i.e. char array).
*/
void strcp(char *s1, char *s2) {
char *temp = *s1;
*s1 = *s2;
*s2 = temp;
}
O / P:
s1 =真的!!我是个好孩子 s2 =嗨,我是个好孩子