簡體   English   中英

在函數 strcpy() 中訪問字符數組時出現分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM