当前位置: 技术问答>linux和unix
为什会出现段错误
来源: 互联网 发布时间:2015-10-18
本文导语: 我有一段程序如下: 1 #include 2 #include 3 4 #include 5 #include 6 7 int get_file_size(char *path, off_t *size) 8 { 9 struct stat file_stats;...
我有一段程序如下:
1 #include
2 #include
3
4 #include
5 #include
6
7 int get_file_size(char *path, off_t *size)
8 {
9 struct stat file_stats;
10
11 if(stat(path,&file_stats))
12 return -1;
13
14 *size = file_stats.st_size;
15 return 0;
16 }
17
18 int main(void)
19 {
20 off_t size;
21 get_file_size("/root/myperl",&size);
22 printf("filesize=%dn",size);
23 return 0;
24 }
以上是可以正常编译通过的没有错误
但是我把主函数改成如下:
int main(void)
{
off_t *size;
get_file_size("/root/myperl",size);
printf("filesize=%dn",*size);
return 0;
}
编译可以通过,但运行的结果如下:
filesize=205
段错误
请问这为什么,是什么原因?
1 #include
2 #include
3
4 #include
5 #include
6
7 int get_file_size(char *path, off_t *size)
8 {
9 struct stat file_stats;
10
11 if(stat(path,&file_stats))
12 return -1;
13
14 *size = file_stats.st_size;
15 return 0;
16 }
17
18 int main(void)
19 {
20 off_t size;
21 get_file_size("/root/myperl",&size);
22 printf("filesize=%dn",size);
23 return 0;
24 }
以上是可以正常编译通过的没有错误
但是我把主函数改成如下:
int main(void)
{
off_t *size;
get_file_size("/root/myperl",size);
printf("filesize=%dn",*size);
return 0;
}
编译可以通过,但运行的结果如下:
filesize=205
段错误
请问这为什么,是什么原因?
|
这是因为你在后面的程序声明的是一个指针,这个指针并没有指向有效的存储空间。当函数get_file_size在执行*size=...一条命令时,由于向无效区域写数据而产生段错误。
|
没有分配内存,指针指向一个随机的地址。
|
看来你不太明白指针是什么。指针只是指向一块内存的地址的变量而已,没有存储空间的,象*size = file_stats.st_size;对于一个没有固定地址的指针来说,一旦退出函数体,file_stats.st_size就无效了,这样这个size指针就很危险了。