有关time.h的问题

编程自留地 2010-08-21 03:54:27
我写了下面的一个程序
#include<stdio.h>
#include<time.h>
main(){
time_t p;
time(&p);
printf("%ld",p);
}
上面这个能正常输出。
#include<stdio.h>
#include<time.h>
main(){
time_t *a;
time(a);
printf("%ld",*a);
}
下面这个有错,segmentation fault.请问是什么原因。
...全文
282 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
rig622 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liuzhidong123 的回复:]

那个函数已经把返回在的地址赋给那个指针了。
[/Quote]

time(a) 实际上是赋值的,a 是一个有固定地址的指针,time(a)是将获得的时间值赋给 a指针指向的内存区域,所以说 a 需要有确定的地址,指针的初始化就可以获得一个地址值。

time_t p;
变量的定义p实际上就是为变量分配一个内存区域,所以此时p已经拥有了固定的地址值,同&p获取其地址值。不知道楼主明白没有。
yskcg 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 liuzhidong123 的回复:]
我写了下面的一个程序
#include <stdio.h>
#include <time.h>
main(){
time_t p;
time(&p);
printf( "%ld ",p);
}
上面这个能正常输出。
#include <stdio.h>
#include <time.h>
main(……
[/Quote]

这个错误的话基本都是指针问题,一般是初始话出错,或者是没有初始化就用指针,这个错误一般叫做是段错误,也就是你的指针指向了不该指向的地方,比如:#o,
我给你改一下:
没有修改的,按照你原来的我调试的结果是这样的:
Breakpoint 1, main (argc=1, argv=0xbffff3b4) at temp.c:24
24 time(a);
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
time (t=0x4b0ff4) at ../sysdeps/unix/sysv/linux/time.c:34
34 *t = res;

也即是在调用这个指针的时候出错了。

修改后,我把指针初始化这样:time_t *a=NULL;

19 #include <stdio.h>
20 #include <time.h>
21 int main(int argc,char **argv)
22 {
23 time_t *a=NULL;
24 time(a);
25 printf("%1d\n",a);
26 }
调试运行结果如下: ./temp
0

奋斗小青年 2010-08-24
  • 打赏
  • 举报
回复
就是*p与p的问题啥
某某9 2010-08-24
  • 打赏
  • 举报
回复
必须要申请内存
赵4老师 2010-08-24
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
yel617 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 rig622 的回复:]

引用 13 楼 liuzhidong123 的回复:

那个函数已经把返回在的地址赋给那个指针了。


time(a) 实际上是赋值的,a 是一个有固定地址的指针,time(a)是将获得的时间值赋给 a指针指向的内存区域,所以说 a 需要有确定的地址,指针的初始化就可以获得一个地址值。

time_t p;
变量的定义p实际上就是为变量分配一个内存区域,所以此时p已经拥有了……
[/Quote]同意
angel_su 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liuzhidong123 的回复:]

那个函数已经把返回在的地址赋给那个指针了。
[/Quote]
函数是传值的,所以time(a)怎么跑都不会改变调用方那个实参a,所以说要初始化才能用。如果你认为time会帮你做好一切,那么形式上应该是a=time()或time(&a)这样子用的...
编程自留地 2010-08-23
  • 打赏
  • 举报
回复
那个函数已经把返回在的地址赋给那个指针了。
rig622 2010-08-22
  • 打赏
  • 举报
回复
呵呵,实际上我对C和C++有时候搞混了,C语言的指针也要初始化吧。。。
JLinfeng 2010-08-22
  • 打赏
  • 举报
回复


任何变量,初始化,都很重要!!!!!!
qazwhl845174869 2010-08-22
  • 打赏
  • 举报
回复
time_t *a;
time(a);
指针a指向哪啊?????
haogeai123 2010-08-22
  • 打赏
  • 举报
回复
指针没有初始化
canshui 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liuzhidong123 的回复:]
引用 6 楼 rig622 的回复:
这就是类的指针和类的对象的区别了:

time_t p; //类的对象
time_t *a; //类的指针

类的指针:他是一个内存地址值,他指向内存中存放的类对象(包括一些成员变量

所赋的值).
类的对象:他是利用类的构造函数在内存中分配一块内存(包括一些成员变量所赋

的值).

也就是说类的指针指向类的对象,只有类的对象才能调……
[/Quote]

c语言中,直接使用指针时,要对它进行初始化!
#include <stdio.h> 
#include <time.h>
#include <stdlib.h>
main(){
time_t *p;
p=(long *)malloc(sizeof(long)) ;
time(p);
printf( "%ld ",*p);
}
编程自留地 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rig622 的回复:]
这就是类的指针和类的对象的区别了:

time_t p; //类的对象
time_t *a; //类的指针

类的指针:他是一个内存地址值,他指向内存中存放的类对象(包括一些成员变量

所赋的值).
类的对象:他是利用类的构造函数在内存中分配一块内存(包括一些成员变量所赋

的值).

也就是说类的指针指向类的对象,只有类的对象才能调用构造函数,分配内存给

类的对……
[/Quote]
我这是C语言的问题,不是面象对象的编程,你只要针对我这个问题给我说明白我就给你分了。
rig622 2010-08-21
  • 打赏
  • 举报
回复
这就是类的指针和类的对象的区别了:

time_t p; //类的对象
time_t *a; //类的指针

类的指针:他是一个内存地址值,他指向内存中存放的类对象(包括一些成员变量

所赋的值).
类的对象:他是利用类的构造函数在内存中分配一块内存(包括一些成员变量所赋

的值).

也就是说类的指针指向类的对象,只有类的对象才能调用构造函数,分配内存给

类的对象。类的指针不具备这样的功能,只有通过 new 调用类的构造函数,并

将类的地址传给类的指针。

类的对象:用的是内存栈,是个局部的临时变量.
类的指针:用的是内存堆,是个永久变量,除非你释放它.
编程自留地 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 prgmbaggio 的回复:]
指针要搭个有效地址才能工作
[/Quote]
两段程序不是一样的吗?
prgmBaggio 2010-08-21
  • 打赏
  • 举报
回复
指针要搭个有效地址才能工作
angel_su 2010-08-21
  • 打赏
  • 举报
回复
嗯,养成习惯看看编译器的反馈信息,很多初学/或容易犯错的地方编译器都一般都已给出警告...
「已注销」 2010-08-21
  • 打赏
  • 举报
回复
time_t *a;
time(a);

请告诉我:指针a指向哪里?
小楫轻舟 2010-08-21
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <time.h>
void main(){
time_t *a = new time_t;
time(a);
printf( "%ld ",*a);

delete a;
}

69,371

社区成员

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

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