读书人

几个C的有关问题

发布时间: 2012-04-20 15:27:03 作者: rapoo

几个C的问题
1.代码可移植和二进制可移植是否一个东西?
2.给定一个指针值,是否可以确定该指针所指对象的类型?
3.哪些字符串处理函数容易造成缓冲区溢出?
4.函数的自动变量保存在哪里?如果一个int型自动变量未初始化,它的值会是0吗?
5.如何用c语言执行shell命令,如何实现管道和重定向功能?要求不能使用system()函数。
6.加入buf中保存的是用户输入的字符串,printf(buf);是否有安全问题?如果有,怎么改才能避免完全问题?

高手指点下 给点参考意见~~~

[解决办法]
1.代码可移植和二进制可移植是否一个东西?
答:二进制是一种代码——机器代码,又牵涉到很多东西,这个一时半会也说不完,
就光“移植”这个概念都很复杂,高级程序语言,注重接口,比如printf,你在LINUX上WINDOWS上都可以用,因为这2个操作系统都实现了这个接口----标准库可以这么理解,就机器代码而言,一般和硬件相关如果有硬件抽象层屏蔽硬件差异那它就是可移植的,但如果没有而硬件的体系结构不一样指令集也就不一样,自然又是不可移植的。
2.给定一个指针值,是否可以确定该指针所指对象的类型?
答:不能,一个指针的值是一个整数,是一个字长等于机器字长的数范围的数,不管什么类型它的地址数都是一样的。
3.哪些字符串处理函数容易造成缓冲区溢出?
答:4楼美女已经说过,程序本身无错,错的永远是人。
4.函数的自动变量保存在哪里?如果一个int型自动变量未初始化,它的值会是0吗?
答:函数的自动变量保存在函数堆栈中,如果一个int 型自动变量为初始化如果在栈中那么它是个随机数,如果在堆中那么它是0;
例子
1 #include <stdio.h>
2 void f(void)
3 {
4 static int i;
5 int d;
6 printf("%d %d\n", i, d);
7 return;
8 }
9 int main(void)
10 {
11 f();//i 打印出0 ,d是个随机数
12 return 0;
13 }

5.如何用c语言执行shell命令,如何实现管道和重定向功能?要求不能使用system()函数。
答 你可以用管道dup + fork + exe族函数 或者 就用popen
6.加入buf中保存的是用户输入的字符串,printf(buf);是否有安全问题?如果有,怎么改才能避免完全问题?
答:在执行它之前 如果你是
char buf[SIZE];
那么加上这句
buf[sizeof (buf) - 1] = 0;// 或者NULL 或者'\0'
如果是char *buf;
buf = make_a_memblock(YOU_KNOWEN_SIZE);
请加上
buf[YOU_KNOWEN_SIZE - 1] = 0;// 或者NULL 或者'\0'


读书人网 >C语言

热点推荐