作者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/cn.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