2010-02-12 28 views
1

這是我今天的第二個問題,指針給我做惡夢。 我試圖做一個程序,做同樣的事情,strcpy()函數做.. 一旦我嘗試它..它崩潰,我100%確定這是我的代碼中的指針問題。我認爲,因爲有一些unintiallized指針(*複製)..但我已經分配了NULL ...所以有人可以告訴我什麼是空分配正是爲了什麼?因爲我認爲我誤解了它的使用。並告訴我,該程序能夠正常運行哪些更正。程序崩潰,指針試圖使strcpy像

#include <iostream> 
using namespace std; 

void mycpy(char *b , char *a); 

int main() 
{ 

    char *original = "this is a text" ; 
    char *copied = 0 ; 

    mycpy(copied , original); 

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ; 

    return 0; 
} 

void mycpy(char *b , char *a){ 

    for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i); 

} 

在此先感謝。

回答

4

那麼,你的mycpy差不多吧(雖然你可能已經中即a[i]代替*(a+1)使用括號,而不是算術)。爲了正確打印複製的字符串,最後一個字符必須爲零,但最後一個是而不是由您的函數複製。所以它應該是像

void mycpy(char *b , char *a) 
{ 
    int i; 
    for(i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i); 
    *(b+i) = 0; // or "\0", doesn't matter  
} 

此外,可變

char *copied = 0 ; 

沒有指向有效的內存,所以你從內存位置0這是非法的閱讀。你可以定義變量數組

char copied[20]; 
1

你有指針,但它們沒有指向任何內存。你需要分配一些內存才能工作。

char *original; 

這只是一個指向char類型的內存的指針。你不能將它設置爲「這是一個文本」,因爲它只是一個指針。它沒有任何空間來存儲「這是一個文本」。

char original[ 15 ] = "this is a text"; 
char copied[ 15 ] = "this is a text"; 

會工作,或

char *original; 
char * copied; 

original = malloc(15); 
copied = malloc(15); 

mycpy(original, "this is a text"); 
mycpy(copied, original); 

這兩種方法都搶到15個字節的存儲您的文本。第一個示例使用堆棧中的15個字節。第二個示例使用堆中的15個字節。

3

您必須爲複製操作的結果分配一些內存。

在你的情況下,copied尚未初始化,所以你試圖寫入一個空指針。下面將分配足夠的內存,爲您original複製到copied

char* copied = new char[strlen(original)+1]; 
+0

可能想的strlen(原件)+ 1,和拉斐爾可能想複製的終止\ 0爲好。 – ChrisInEdmonton 2010-02-12 19:58:37

+0

@ChrisInEdmonton,謝謝,正在衝,並沒有注意.... – Glen 2010-02-12 20:03:28

0

在這一行:

for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i); 

它的b+i導致錯誤的取消引用。您正在取消0(NULL),這是1號指針錯誤。

1

修正:

#include <iostream> 
using namespace std; 

void mycpy(char *b , char *a); 

int main() 
{ 

    char *original = "this is a text" ; 
    char copied[30]; // you need to actualy allocate space 
    // (this is on stack, you could use new as well, for heap allocation) 

    mycpy(copied , original); 

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ; 

    return 0; 
} 

void mycpy(char *b , char *a){ 
    int i =0; 
    while (*(a+i)) { 
     *(b+i) = *(a+i); 
     ++i; 
    } 
    *(b+i) = '\0'; // null termination 
}