程序c语言问题,C语言问题集锦

1、gets()函数:

函数gets()从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出,推荐使用标准函数fgets()代替。

2、换行:

window操作系统下的换行为'\r\n',linux和unix操作系统下为'\n'

3、strcpy()函数:

使用strcpy()的时候一定要检查接收变量的容量是否足够,推荐使用strncpy()或memcpy()。

4、main()函数返回值:

main()的返回类型应该是“int”而不是“void”,因为“int”返回类型会让程序返回状态值。这点非常重要,特别当程序是作为依赖于程序成功运行的脚本的一部分运行时。

5、内存泄露:

在程序模块中动态申请内存时,用完的时候必须马上释放,虽然改程序结束时会自动释放,但如果申请内存是在while语句中,则会造成严重的内存泄露。

6、free出错:

指针的值在程序中被修改,导致传给free()的地址出错,也就导致了seg-fault或者崩溃。

7、atexit()函数:

如果使用atexit()就应当使用exit()或者“return”与之相配合,而不应该用_exit()函数

8、能接受任何类型的参数并返回interger(整数)结果的函数:

int func(void *ptr)

9、运算符:

“++”和“*”的优先权一样,所以“*ptr++”相当于“*(ptr++)”。即应该先执行ptr++,然后才是*ptr

10、排错:

char *ptr = "Linux";   *ptr = 'T';

通过*ptr = ‘T’,会改变内存中代码段(只读代码)“Linux”的第一个字母。这个操作是无效的,因此会造成seg-fault或者崩溃。

11、会改变自己名字的进程:

#include

int main(int argc, char *argv[])

{

int i = 0;

char buff[100];

memset(buff,0,sizeof(buff));

strncpy(buff, argv[0], sizeof(buff));

memset(argv[0],0,strlen(buff));

strncpy(argv[0], "NewName", 7);

// Simulate a wait. Check the process

// name at this point.

for(;i<0xffffffff;i++);

return 0;

}

12、返回本地变量的地址:

#include

int* inc(int val)

{

int a = val;

a++;

return &a;

}

int main(void)

{

int a = 10;

int *val = inc(a);

printf("\n Incremented value is equal to [%d] \n", *val);

return 0;

}

尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。因为本地变量的生命周期就是“inc()”的生命周期,所以在inc结束后,使用本地变量会发生不好的结果。这可以通过将main()中变量“a”的地址来避免,这样以后还可以修改这个地址存储的值。

printf函数:

13、C语言里函数的参数默认是从右往左处理的,输出时是从左往右。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值