問題描述:
c語言直接呼叫未宣告的函式的坑,跟之前的一篇直接malloc返回值的錯誤有點像。
現象下面的函式呼叫,返回值的指標訪問不了:
main.c
testmalloc * test = functest();
printf("%d",test);
test.h
typedef struct __testmalloc
testmalloc;
test.c
testmalloc * functest()
列印分配的指標與返回的指標都是有效的,那麼為啥就是外層的指標訪問就崩潰呢。
問題分析:
再vs中會有乙個警告:
warningc4047: 「初始化」:「testmalloc *」與「int」的間接級別不同
c4047一般是兩個指標不匹配。怎麼會不匹配呢?為題就處在這兒
再linux中的警告:
初始化時將整數賦給指標,未作型別轉換 [預設啟用]
再linux上直接在內外列印指標,兩邊的指標位數不一致。再vs直接訪問不了記憶體。
問題原因:
如果我們使用函式沒有前項宣告或者在標頭檔案裡宣告,c語言預設隱式宣告。
~ps,請養成使用前宣告的好習慣,少給自己和別人挖坑。
c98的描述
if the expression that precedes the parenthesized argument list in
a function call consists solely of an identifier, and if no
declaration is visible for this identifier, the identifier is
implicitly declared exactly as if, in the innermost block containing
the function call, the declaration
extern int identifier();
如果表示式在括號引數列表之前函式呼叫僅包含乙個識別符號,如果沒有該識別符號可見宣告,
該識別符號為在包含以下內容的最裡面的塊中完全隱式宣告
函式呼叫,宣告
extern int identifier();
也就是說不管這個函式是什麼樣,只要返回值不是int,不宣告就會有問題。導致返回值就是int值,如果int溢位,導致返回的指標或者其他資料型別出錯。
問題解決方法:
無他,請宣告
C語言 函式(宣告 定義 呼叫)
1 函式的宣告 函式有兩種型別 1 有返回值 前面用 int float double char來定義的,如int even int n 前面的int就是返回值型別,注意最後要加分號。include inteven int n 2 沒有返回值,就用void寫在最前面,如void even int n...
C語言中函式宣告與呼叫問題
假如函式在呼叫它之前定義可以不用宣告 實際上,如果在函式呼叫前,沒有對函式作宣告,則編譯系統會吧第一次遇到的該函式的形式 函式定義或者函式呼叫 作為函式的宣告,並將函式預設值型別認為int型www.cppcns.com 比如有您調gsecpxij用的是void max int a,int b www...
C語言 函式宣告
可行,但不推薦 沒有宣告就呼叫函式,c編譯器會為之生成乙個臨時宣告,而臨時宣告和真正的函式定義未必是一致的 函式宣告的作用是把有關函式的的資訊 函式名 函式型別 函式引數的個數與型別 通知編譯系統,以便在編譯系統對程式進行編譯時,在進行到main函式呼叫其它函式時知道它們是函式而不是變數或其它物件。...