[英]Got Segmentation fault on accessing char array in function strcpy()
當我使用以下代碼時,我總是遇到分段錯誤。 有什么問題或者我們不能在這個特定的數組中寫入。
char *Strcpy(char *str1,const char *str2){
for(int i = 0; *str1 ; i++){
*(str1+i) = *(str2+i);
if(*(str2+i)=='\0'){
*(str1+i) = '\0';
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 s1[] = "Hello World";
char s2[] = "It's String";
但是,這樣做時,它只會分配足夠的內存來存儲字符串,包括其空終止符。 如果您希望能夠增加字符串的大小,那么您必須分配更多的內存。 或者,您可以簡單地使用std::string
,它會為您處理內存分配並根據需要分配額外的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.