2013-05-30 29 views
0

我正在使用谷歌C++測試工具進行單元測試。我是新手C程序員和測試人員。 以下是我的代碼片段:指向結構的運行時錯誤

TEST_F (def_fix, SR_M_T) { 
    I_M_S * arg; 
    RM__S_F_R_T* message_data; 
    char mT[MAX_M_T_LENGTH] = "data"; 

    strcpy(message_data->mT,mT); 
    message_data->rUID[0] = '\0'; 
    message_data->uT[0] = '\0'; 

    unsigned char buffer[sizeof(RM__S_F_R_T)+2]; 
    memcpy(&buffer[2],message_data,sizeof(RM__S_F_R_T)); 

    buffer[0] = 1;  //This assignment is not important for this test 
    buffer[1] = 2;   //This assignment is not important for this test 

    arg->payload_data = buffer; 

    handleSR(arg); 
} 

上面並正在創造什麼傳入消息。此傳入消息arg將用作參數來調用函數handleSR (void *).
def_fix是一個默認夾具類,其中包含SetUp()TearDown()並且沒有什麼奇特的。

RM__S_F_R_T是一個包含3個字符串的結構。 I_M_S是包含指向RM__S_F_R_T的指針的結構。

當我谷歌測試這個,它給出了分割錯誤。但是,當我更改: RM__S_FR_R_ * message_data;RM__S_FR_R_ message_data;和使用.運算符而不是->運算符,事情往往工作。誰能解釋一下?

+1

您的'message_data'指針變量正在被使用未初始化。 – jxh

+0

所以這是一個運行時錯誤,而不是編譯錯誤? – jerry

+0

@jerry,是的,分段錯誤總是運行時錯誤。如果編譯器得到分段錯誤,則意味着編譯器崩潰。 –

回答

0

這是因爲你聲明message_data是一個指針,但不要指向任何東西。那麼它會指向一個隨機的內存位置,當您將其解除引用時會導致未定義的行爲。

要麼聲明它不是一個指針,要麼爲它分配內存。

+0

謝謝。瞭解。但是如果我仍然想用它作爲指針,我該怎麼辦?只是好奇。 另外我的函數handleSR()沒有返回任何東西。那麼,我該如何斷言或期待什麼?我讀了一些帖子,斷言這些函數正在被這個函數修改的變量,但我不知道如何訪問這個函數的結果。任何幫助,將不勝感激。 – user2435273

+0

@ user2435273在這種情況下,我看不到需要使用指針,但是如果您必須將其作爲指針,則需要爲其分配內存,例如, 'RM__S_F_R_T * message_data = malloc(sizeof(RM__S_F_R_T));' –

2

這兩句話:

RM__S_F_R_T* message_data; 
strcpy(message_data->mT,mT); 

的罪魁禍首。你永遠不會初始化RM__S_F_R_T(誰設計這個東西?!)指針。當不用它作爲指針時,你可以在堆棧上創建一個可以使用的實例。

要解決或者不使用指針(你已經發現了這一點),或分配內存:

message_data = malloc(sizeof(RM__S_F_R_T)); 

不要忘記free(message_data)當你用實例來完成,否則你會泄漏記憶。

0

你以後

message_data = (RM__S_F_R_T*)malloc(sizeof(RM__S_F_R_T)); 
0

初始化I_M_S * argRM__S_F_R_T* message_data沒有提供內存RM__S_F_R_T *。使用message_data:

I_M_S * arg = malloc(sizeof(I_M_S)); 
RM__S_F_R_T* message_data = malloc(sizeof(RM__S_F_R_T)); 

此外,請確保您的範圍後,不使用這些分配的指針功能TEST_F(),因爲您分配了arg->payload_data = buffer,其中局部變量buffer的範圍在功能TEST_F()之後結束。

所以,在你離開之前TEST_F()釋放這些指針:

免費(ARG); free(message_data);

0

message_data不指向任何東西。您需要將初始化的RM__S_F_R_T結構指針作爲參數傳遞給函數,或者在函數內部初始化它。

此外,我認爲message_data->mT是一個字符指針。目前沒有指向任何東西。

你可以使用malloc爲它分配空間,或者如果它是一個char數組,那麼確保它足夠大以容納mT(假設它的結構已經被初始化)。

以上適用於所有message_data的會員。

正如其他海報已經提到,不要忘了free()你有什麼malloc() -ed。

+0

另外我的函數handleSR()沒有返回任何東西。那麼,我該如何斷言或期待什麼?我讀了一些帖子,斷言這些函數正在被這個函數修改的變量,但我不知道如何訪問這個函數的結果。任何幫助,將不勝感激。 – user2435273

+0

http://en.wikipedia.org/wiki/Assert.h 你可以不在'handleSR()'中放置'assert'語句嗎?或者,也許你可以改變它返回的東西?像:'assert(handleSR(msg)!= NULL);'如果我們假設'handleSR()'返回一個指向資源的指針。 – Nobilis

+0

handleSR()所做的是處理輸入消息,處理數據庫,查找某些行/列,然後創建與我創建的消息類似的消息(I_M_S * arg;),然後進行廣播。 我更喜歡做的是以某種方式訪問​​存儲某種狀態並檢查它的函數的局部變量之一。我無法更改API,因此不能使functin返回一些內容。 – user2435273