函数内部的系统函数(ctime)声明???

dxms8 2011-01-19 08:58:45
Linux 64位环境
func(buf)
char buf[];
{
char *pnt;
long tim;
char *ctime(); //这里..没有这行的话(接下面注释)
time(&tim);
pnt = (char *)ctime(&tim);//这一行会报segment error,运行时才会报,编译通过
}


看了下msdn,ctime是这样子的
char *ctime(
const time_t *timer
);

据调查,ctime(&tim)貌似返回了一个32位的int,而pnt是64位的指针,所以报错(也有可能不是)。
这么推测的理由是编译的时候那一行有个warning:cast to pointer from Interger of different size.
加了char *ctime(); 就没有这个warning并一切正常了。

我想问的是:
这个函数内部的char *ctime();是什么用法啊?
为什么这么声明下ctime(&tim)就正常了呢?明显一个带参一个不带参...不懂,求教。

...全文
182 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnYidan 2011-01-20
  • 打赏
  • 举报
回复
声明函数原型时可以不带参数的数据类型,编译起将不对此函数做实际参数做类型检查
AnYidan 2011-01-20
  • 打赏
  • 举报
回复
在函数内部声明函数原型

c programming languange 中大量使用
leihelin5201314 2011-01-20
  • 打赏
  • 举报
回复
func(buf)
char buf[];
{
}
=====================
这是很早之前的了,下面这样不行吗?

func(char buf[])
appx 2011-01-20
  • 打赏
  • 举报
回复
楼主头文件没有引入吧。
char *ctime(); //这里..没有这行的话(接下面注释)
的目的不就是声明此函数吗?
bluejays 2011-01-19
  • 打赏
  • 举报
回复
刚才一迷糊写错了:x86里面的返回值不是通过栈传递的,而是寄存器eax(64位是rax)
bluejays 2011-01-19
  • 打赏
  • 举报
回复
这个函数内部的char *ctime();是什么用法啊?
这就是一个函数声明,告诉编译器:ctime是一个函数,返回值是char*类型,参数不确定。

关于参数的声明要特别注意:在c++里面char *ctime(); 等同于char *ctime(void); 意思是没有参数。
但是c里面就不同,括号里面没有写参数,表示参数可能是任意个、任意类型。
c++里面要求调用函数之前必须先声明;c里面没有这个要求,而是有个默认声明的概念。
如果编译器见到调用了一个函数,而这个函数此前没有声明过,c++会报错,而c会自动给这个函数做一个声明。
比如这里的pnt = (char *)ctime(&tim); 如果此前不声明ctime,c编译器产生的默认声明会是这样的:
int ctime(int *);
默认返回int,而参数就是按照调用的格式来的。
有了这个声明,那个warning就容易理解了,因为这里把一个32位的int转换到64位的指针。

运行时出现的segment error错误,我不认为是这一行赋值的时候出现的,很可能是接下来访问了*pnt才会出错。
出错的原因还是和前面的声明有关。如果声明了ctime,编译器知道这个函数返回char*,他就会从栈上取出8个字节赋值给pnt。但是如果没有那个声明,编译器就会认为ctime返回int,于是他只从栈上取4个字节赋值给pnt,(虽然ctime把8个字节的返回值放到了栈上)。这个赋值本身不会造成segment error错误,但是接下来访问*pnt显然就会访问到错误的地址。
ayw215 2011-01-19
  • 打赏
  • 举报
回复
func(buf)
char buf[];
===
lz还用这么古老的声明方式啊
Jim_King_2000 2011-01-19
  • 打赏
  • 举报
回复
time_t tim;

千万别自己声明库函数。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧