2016-02-16 73 views
-1

我有調用這個主要功能:傳遞一個malloc分配的char *爲構造函數,用printf上的char *給分段錯誤

int main (int argc, char * argv[]) { 
    char * x = (char*) malloc(100); 
    x = "test string"; 
    printf("data: %s", x); 
    StreamManager * SM = new StreamManager(NULL, x); 
} 

StreamManager在這裏有一個構造函數:

StreamManager::StreamManager(ConnectionManager * CMin, char * data) { 
    printf("Creating StreamManager\n"); 
    printf("%s\n", data); 
    printf("done"); 

    ... 
} 

調用此產生輸出:

data: test stringCreating StreamManager 
test string 
Segmentation fault (core dumped) 

爲什麼?它不應該被終止?

編輯:即使更改後問題仍然存在。

MAIN:

char * x = (char*) malloc(100); 
strcpy(x, "This is a test"); 
StreamManager * SM = new StreamManager(NULL, x); 

的構造函數:

printf("Creating StreamManager\n"); 
printf("%s\n", data); 
printf("done"); 
fflush(stdout); 

完成不打印。我認爲segfault發生在構造函數的第二個printf中。

+0

爲什麼?你到底在問什麼 – shafeen

+0

爲什麼會發生段錯誤?不應該在「測試字符串」之後打印「完成」?另外,如果我將測試字符串更改爲「測試字符串\ 0」,它仍然存在問題。 – user3760657

回答

5

傳遞一個malloc分配的char *爲構造函數,用printf上的char *給出了分段故障

你是不是「傳遞malloc倒是char *'到任何構造函數:

char * x = (char*) malloc(100); 

這裏你malloc -ing 100個字節和地址存儲到x.

x = "test string"; 

這裏你是改變變量x指向文字字符串"test string",該字符串已經以null結尾。此時您還導致了100字節的內存泄漏。

printf("Creating StreamManager\n"); 

在這裏,您正在成功地打印一條消息。

printf("%s\n", data); 

在這裏,您正在成功印刷"test string"

printf("done"); 

在這裏,您已成功打印"done",但它可能不會出現由於stdio緩衝。

... 

在這裏,你正在做的事情別的祕密,這是造成核心轉儲。

+0

如何在代碼移動之前將代碼完成打印「完成」?我試圖調試我的程序,以確保它能正常工作,並且想知道段錯誤發生的具體時間。 – user3760657

+0

立即調用'fflush(stdout);'。你有沒有考慮過使用調試器?如果不是,爲什麼不呢?這就是他們的目的。 – EJP

+0

我將使用調試器,這只是一個特例。 – user3760657

2

x = "test string";不會將字符串複製到您分配的緩衝區中,而是將x指向const char*指向"test string"

在這種情況下,您必須使用strcpy(char * destination, const char * source)函數,如strcpy(x, "test string"),它也將處理它的空終止部分。


編輯

從您發佈的東西,該段錯誤似乎無關的代碼,您發佈的片斷。