问题
当我使用以下代码时,我总是遇到分段错误。是否有问题或我们无法在此特定数组中写入。
法典
char *Strcpy(char *str1,const char *str2){
for(int i = 0; *str1 ; i++){
*(str1+i) = *(str2+i);
if(*(str2+i)==' '){
*(str1+i) = ' ';
break;
}
}
return str1;
}
int main(){
char* s1=(char*)"Hello World";
char* s2=(char*)"It's String";
char* t = Strcpy(s1,s2);
cout<<t<<endl;
}
错误
程序接收信号SIGSEGV,分段错误。 0x000055555555f939 in Strcpy(char*, char const*(
像"Hello World"
这样的字符串文本具有类型char const[]
并存储在只读内存中,尝试更改它们会使应用程序崩溃。像你一样抛弃const
并不能解决这个问题。
一种解决方法是在堆栈上分配目标字符串:
char s1[] = "Hello World";
您可能希望以更简单的规范方式复制字符串:
char *Strcpy(char *dst, const char *src) {
char* r = dst;
while(*dst++ = *src++); // <--- canonical string copy
return r;
}
您正在执行以下行的操作不应执行:
char* s1=(char*)"Hello World";
char* s2=(char*)"It's String";
诸如"Hello World"之类的字符串文本存储在只读内存中,因此不允许修改。这就是为什么字符串文字在 C++ 中具有类型修饰符const
(这不适用于语言 C,即使它们在那里也是只读的(。因此,切勿使用类型char *
的非常量指针指向它们。
如果要将字符串存储在可写内存中,则必须分配一个 char 数组并对其进行初始化,如下所示:
char s1[] = "Hello World";
char s2[] = "It's String";
但是,执行此操作时,它只会分配足够的内存来存储字符串,包括其 null 终止符。如果希望能够增加字符串的大小,则必须分配更多内存。或者,您可以简单地使用std::string
,它会为您分配内存并根据需要分配额外的内存。