目录
1,#define和typedef
test.c文件中包括如下语句:
#define INT_PTR int* typedef int*int_ptr; INT_PTR a,b; int_ptr c,d; 文件中定义的四个变量,哪个变量不是指针类型?( )A.a
B.b
C.c
D.d
正确答案:B。#define是查找替换,和main函数内原理类似,而typedef没有这个问题,所以typedef两个都是指针
2,free的注意事项
以下哪个不是动态内存的错误( )
A.free参数为NULL
B.对非动态内存的free释放
C.对动态内存的多次释放
D.对动态内存的越界访问
答案:A。
3,函数返回值
关于下面代码描述正确的是( )
char *GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); }A.printf函数使用有问题
B.程序正常打印hello world
C.GetMemory函数返回的地址无法正常使用
D.程序存在内存泄露
答案: C,局部变量指针不能作为返回值,因为函数结束后就会释放该函数栈帧,打印的结构是不确定的,虽然str的地址没有变化,但地址指向的空间已经被收回操作系统了,指向的内容可能会发生改变
4,3的类似题
关于下面代码描述不正确的是:
void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); }A.上面代码没问题
B.上面代码存在内存泄露
C.上面代码可能会崩溃,即使GetMemory函数返回,str依然为NULL
D.GetMemory函数无法把malloc开辟的100个字节带回来
答案:A,传值是错误的,正确的是传地址调用,不设计返回值