当前位置: 技术问答>linux和unix
linux下的c语言怪现象
来源: 互联网 发布时间:2016-08-13
本文导语: 一个奇怪的现象,想请教一下大家,就是一个写文件的操作,代码如下: #include #include #include #include #include #include #include int main() { //char g; int fd; char *buf; char g; char *readbuf; int readlen; ...
一个奇怪的现象,想请教一下大家,就是一个写文件的操作,代码如下:
#include
#include
#include
#include
#include
#include
#include
int main()
{
//char g;
int fd;
char *buf;
char g;
char *readbuf;
int readlen;
if((fd=open("test.c",O_RDWR|O_CREAT|O_APPEND,7*8*8))==-1)
{
perror("create file errorn");
exit(0);
}
printf("please input the string.n");
if(gets(buf)==NULL)
{
printf("get string error:%sn",errno);
exit(0);
}
if(write(fd,buf,strlen(buf))==-1)
{
printf("write file error:%sn",errno);
exit(0);
}
write(fd,"n",1);
close(fd);
return 0;
}
在这段代码中,当我把char g定义在char *buf之前时,运行时就会报段错误,但放在它后面就不会报错;
而且如果我把char *buf定义成char buf[20],则不管char g定义在前面还是后面都不会出错,请问这是何故呀?
#include
#include
#include
#include
#include
#include
#include
int main()
{
//char g;
int fd;
char *buf;
char g;
char *readbuf;
int readlen;
if((fd=open("test.c",O_RDWR|O_CREAT|O_APPEND,7*8*8))==-1)
{
perror("create file errorn");
exit(0);
}
printf("please input the string.n");
if(gets(buf)==NULL)
{
printf("get string error:%sn",errno);
exit(0);
}
if(write(fd,buf,strlen(buf))==-1)
{
printf("write file error:%sn",errno);
exit(0);
}
write(fd,"n",1);
close(fd);
return 0;
}
在这段代码中,当我把char g定义在char *buf之前时,运行时就会报段错误,但放在它后面就不会报错;
而且如果我把char *buf定义成char buf[20],则不管char g定义在前面还是后面都不会出错,请问这是何故呀?
|
char *buf; /* buf未分配内存就使用,很可能报段错误. 不报是因为凑巧 */
char buf[20]; 分配了内存,但是gets不安全,你一次输入很长的字符串就会报错,建议使用fgets
char buf[20]; 分配了内存,但是gets不安全,你一次输入很长的字符串就会报错,建议使用fgets
|
char *buf没有分配空间,没有初始化buf指向的是什么地方没准,运行的时候基本上就是听天命了,什么错误都可能,不出错误也可能。
char buf[20]分配了空间,buf指向这个空间,运行的结果是可预期的。
char buf[20]分配了空间,buf指向这个空间,运行的结果是可预期的。
|
跟char g在哪里定义没有关系。
具体原因LZ兄弟们已经说了。指针没赋值之前,也所指向的内容是不可预期的。
具体原因LZ兄弟们已经说了。指针没赋值之前,也所指向的内容是不可预期的。
|
LZ补习补习C语言
定义 char *g cha g[20],是不一样的。
主要是涉及到C语言内存分配问题。
定义 char *g cha g[20],是不一样的。
主要是涉及到C语言内存分配问题。
|
open("test.c",O_RDWR|O_CREAT|O_APPEND,7*8*8))==-1)
觉得应该是上面这句有问题。有O_CREAT标志,就不应该有O_APPEND。
觉得应该是上面这句有问题。有O_CREAT标志,就不应该有O_APPEND。
|
基本功
|
那如果我初始化为:char *buf = NULL;行不行啊?