作者yshihyu (yshihyu)
看板C_and_CPP
標題[問題] 函數原型宣告造成記憶體問題
時間Fri Nov 25 00:24:36 2016
開發平台(Platform): (Ex: Win10, Linux, ...)
stm32 freertos
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
IAR
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[4] = {0};
printf("main=%p\n",(void*)a);
test(a);
return 0;
}
void test(int *a)
{
printf("test=%p\n",(void*)a);
}
warning: implicit declaration of function ‘test’
[-Wimplicit-function-declaration]
我今天在stm32 freertos 寫程式沒加上函數原型宣告
程式類似上面這樣印出記憶體位址結果竟然不一樣, test 印出來是一塊不合法位址 access 會造成crash
後來我看編譯器有提醒沒加函數原型加上後, 兩邊印出來記憶體位址都一樣
在程式在pc 上沒問題~好奇為什麼在STM32 freertos / IAR 編譯器跑出來會有這樣情況?
我理解的是函數原型在檢查呼叫傳入參數型態個數跟定義函數是否有一致~
不一致編譯器會報 warning
可是我就算沒宣告原型應該不至於test函數會印出不一樣位址, 因為我兩邊型態都是 int*
請問有人知道這是什麼原因造成 test 函數印出來位址跟 main 函數的 a 陣列位址是不相同
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.182.114.69
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1480004680.A.86B.html
※ 編輯: yshihyu (175.182.114.69), 11/25/2016 00:25:52
1F:推 Bencrie: 函數預設原型是 void func(int) 11/25 00:45
2F:→ Bencrie: int 11/25 00:47
3F:→ Bencrie: int 跟 int* 不見得一樣長 11/25 00:47
4F:→ yshihyu: 我想起來有預設原型xd...感謝你提醒 11/25 00:50