C语言经典习题——函数
一、int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_8__,*(*(a+1)+0)的值是___8___
二、char *s = "abcde";以下哪一个是错的
A:char s[10] = "abcdefg";
B:char t[] = "abcdefg"; char *s = t;
C:char s[10]; s="abcdefg"; //数组名是常量,不能赋值,定义时赋值则可以char s[10]="abcdefg";
D:char s[10]; strcpy(s,"abcdefg");
四、以下代码会执行printf("equal\n");语句吗 ? //会执行
char *p1 = "Hello"; char *p2 = "Hello"; //p1和p2相同;
if(p1==p2)
{
printf("equal\n");
}
五、以下代码有什么问题吗?
(1)
int * fun()
{
int x = 100;
return &x; //函数调用结束会销毁变量x,不能再使用;
}
(2)
int *fun()
{
int *p = (int *)malloc(4);
return p; //调用完再free()则无错;
}
六、以下代码有什么问题吗?
void f1(char *p)
{
p = (char *)malloc(100);
}
int main()
{
char *str = NULL;
f1(str); //p的值并没返回,即str任然为NULL;
strcpy(str, "hello world");
printf(str); //无法打印
}
七、以下代码有什么问题吗?
char *fun()
{
char p[] = "hello world"; //字符串存在代码段;假赋值,调用结束就销毁
return p;
}
void Test(void)
{
char *str = NULL;
str = fun(); //因为函数调用结束就销毁了p所在的内存空间
printf(str); //可能打印正确
}
八、以下代码有什么问题吗?
char *fun()
{
char *p = "hello world"; //字符串存在数据段常量区中
return p;
}
void Test(void)
{
char *str = NULL;
str = fun();
printf(str); //可以打印
}
九、以下代码有什么问题吗?
void fun(char **p, int num)
{
*p = (char *)malloc(num); //*p == *&str == str
}
void Test(void)
{
char *str = NULL;
fun(&str, 100); ///str的值改变
strcpy(str, "hello");
printf(str); //可以打印
free(str);
}
十、以下代码有什么问题吗?
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str); //str还是指向开辟的空间
if(str != NULL)
{
strcpy(str, “world”);///malloc开辟的空间已经释放,复制不到malloc开辟的空间
printf(str); ///但可以打印world
}
}
十一、以下代码printf()语句会执行吗?
float f = 0; //float 有误差,可能是0.00001
if(f==0) //if(f>=-0.000001 && f<0.000001)可以使用
{
printf("f==0\n");//可能执行
}
十二、以下代码的打印结果是什么?
void f1(short a[100]) //因为编译器会把short a[100]转换成short *a
{
printf("%d\n",sizeof(a)); ///4
}
void f2(short *a);
{
printf("%d\n",sizeof(a)); ///4
}
void f3(short a[]);
{
printf("%d\n",sizeof(a)); ///4
}
十三、
unsigned char *p1 = (unsigned char *)0x801000; ///0x801005
unsigned char (*p2)[3] = (unsigned char (*)[3])0x810000; ///0x810015
请问p1+5等于多少?
p2+5又等于多少?
十四、
short a[3];
printf("%p\n",a);//结果为0x801000;
那么printf("%p\n",a);printf("%p\n",&a);printf("%p\n",&&a);的结果是多少?
//a(第一个元素的地址)的偏移量是2个字节;结果为0x801000;
//&a(整个数组的地址)的地址,偏移量是6个字节;结果为0x801000;
//&(&a)没有(&a)这个变量,所以编译报错;
十五、以下程序有错吗?
void test()
{
char string[3];
char *s = "abc";
strcpy(string,s);///会把'\0'复制过去,会数组越界;
}
十六、
int x = 0,y = 1;
if(x && ++y); //0
x月y的值是多少? //x=0,y=1
int x = 0,y = 1;
if(++x && ++y); //1
x月y的值是多少?//x=1,y=2;
十七、
void f1()
{
char **p;
*p="abc"; // *p的内存未开辟,非法引用
}
void f2()
{
char **p; //这样就可以了
char *p1;
p = &p1;
*p = "abc";
}
注意: 未开辟的内存和以释放的内存不能使用!
函数的地址可以返回,函数的地址编译时确定, 程序运行就可以使用!