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";
}
注意: 未开辟的内存和以释放的内存不能使用!
          函数的地址可以返回,函数的地址编译时确定, 程序运行就可以使用!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值