2014-01-22 112 views
0

嗨,當我嘗試在我的程序中使用斷言功能它轉儲代碼。任何人都可以告訴我我的代碼有什麼問題。核心轉儲聲明

#include <stdio.h> 
#include <assert.h> 
void print_number(int myConfig) { 
    assert (myConfig > 20); 
    printf("\nConfig value is : %d",myConfig); 
} 

int main() 
{ 
int configArr[]={21,27,15}; 
for(int i=0;i<=2;i++) 
    print_number (configArr[i]); 
return 0; 
} 

輸出:

配置值是:21
配置值爲:27Assertion失敗:的myconfig> 20,文件assert.cpp 4行
中止(核心轉儲)

+2

邊注:請打印新的生產線在字符串的結尾,而不是在一開始的習慣。這應該正確地刷新輸出緩衝區,並避免醜陋的運行,例如在你的例子中的「27」之後。 –

+0

雅感謝您的信息:) – Jeyamaran

回答

3

你的代碼沒有問題。

斷言宏檢查斷言或假設的有效性。如果斷言結果爲FALSE,則宏寫入關於在stderr上失敗的調用的信息,然後調用abort()。 abort()會引發SIGABRT信號,這會導致進程異常終止。

在你的代碼中,在for循環的第三次(好,第二次技術!)迭代中,「myConfig> 20」失敗,因爲myConfig的值是15,因此進程異常終止。

0

當我運行代碼我得到以下輸出

Config value is : 21 
Config value is : 27 
a.out: test.c:4: print_number: Assertion `myConfig > 20' failed. 
Aborted 

看到您的陣列的第三構件是15,其小於20,以便它沒有assert函數因此它將給你的聲明消息並中止。

我看不出有任何核心轉儲這裏。

1

您的代碼是確定的。當代碼執行時,如果assert表達式(15> 20)爲假,assert()寫入信息有關失敗在stderr呼叫,然後調用abort()這提高了SIGABRT信號,並且可以根據系統的設置來產生核心轉儲。

0

assert是它基本上用於檢查在運行時的條件的宏。如果條件失敗,那麼您的程序在此時爲aborted。由於程序在沒有完全運行的情況下終止,因此可能需要檢查當時的程序狀態。 core dumped表示內存的快照,寄存器內容。系統通常會將該文件轉儲到某個特定的目錄中。

在你的代碼中,assert失敗的最後一個條件,因此流產和核心轉儲。