2012-09-26 64 views
3

這是一本教科書的C代碼爲什麼字符值複製在OS X中不起作用?

void strcpy_new(char *s, char *t) { 
    while ((*s = *t) != '\0') { 
     s++; 
     t++; 
    } 
} 

int main(int argc, const char * argv[]) 
{ 

    char *s = "this is line a"; 
    char *t = "this is line b"; 
    printf("%s", s); 
    strcpy_new(s, t); 
    printf("%s", s); 
    return 0; 
} 

,當我在Xcode運行它,我得到了EXEC_BAD_ACCESS。

+1

顯示如何調用'strcpy_new' – Marlon

+0

我用完整的代碼編輯了我的問題 –

回答

5

您得到EXEC_BAD_ACCESS的原因是因爲那些字符串文字"this is line a""this is line b"存儲在只讀存儲器中。試圖寫入它(*s = *t)是未定義的行爲,並因此收到崩潰。

要解決這個問題的代碼,你應該分配一些內存s,使其大到足以容納第二個字符串(t):

char s[] = "this is line a"; // contrived example, s and t are the same length 
    char *t = "this is line b"; 
    strcpy_new(s, t); 
1

的問題是,重寫一個字符串的影響是不確定的。

char *s = "this is line a"; 
char *t = "this is line b"; 
strcpy_new(s, t); 

st都關閉在代碼中的數據部分,以及特定的設置正好給你一個EXEC_BAD_ACCESS,當您試圖改變它們。

2

我敢打賭,你想與對方char *s是字面

#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    char *a = "Some String"; 
    char *b = "Another string"; 
    strcpy(b, a); 
    return 0; 
} 

字符串將給出EXEC_BAD_ACCESS運行strcpy_new。下面,但是,不會

#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    char *a = "Some String"; 
    char b[] = "Another string"; 
    strcpy(b, a); 
    return 0; 
} 

不同的是,在第一種情況下,b指向的存儲器中可執行的__TEXT,__cstring,cstring_literals截面的塊,其被寫保護。在第二種情況下,它指向堆棧上的一塊內存。

1

字符串文字是隻讀的。在這裏找到一個很好的答案:http://ubuntuforums.org/showthread.php?t=357869

C中的字符串文字是隻讀的。在你的示例代碼中,「我的字符串」是一個字符串文字。

str []聲明將文字複製到可寫內存(堆棧或堆)中。因此,你的程序可以修改字符串。

*聲明初始化一個指向文本本身的指針,所以你有一個指向只讀段的指針。如果你嘗試覆蓋它,你會得到SEGV。

相關問題