在函数 strcpy() 中访问字符数组时出现分段错误



问题

当我使用以下代码时,我总是遇到分段错误。是否有问题或我们无法在此特定数组中写入。

法典

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,它会为您分配内存并根据需要分配额外的内存。

最新更新