嵌入式linux面试题解析(二)——C语言部分三

2019-07-12 23:25发布

嵌入式linux面试题解析(二)——C语言部分三

1、下面的程序会出现什么结果
#include
#include #include
void getmemory(char *p)
{
    p=(char *) malloc(100);
    strcpy(p,”hello world”);
}
int main( )
{
    char *str=NULL;
    getmemory(str);
    printf(“%s/n”,str);
    free(str);
    return 0;
}
程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险 2、(void *)ptr 和 (*(void**))ptr的结果是否相同?
答:ptr为同一个指针
(void *)ptr 和 (*(void**))ptr值是相同的 3、对绝对地址0×100000赋值且想让程序跳转到绝对地址是0×100000去执行
(unsigned int*)0×100000 = 1234;
首先要将0×100000强制转换成函数指针,即:
(void (*)())0×100000
然后再调用它:
*((void (*)())0×100000)();
用typedef可以看得更直观些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0×100000)(); 4、下面的函数实现在一个数上加一个数,有什么错误?请改正。
int add_n ( int n )
{
    static int i = 100;
    i += n;
    return i;
}
    当你第二次调用时得不到正确的结果,难道你写个函数就是为了调用一次?问题就出在 static上
5、下面这个程序执行后会有什么错误或者效果:
#define MAX 255
int main()
{
    unsigned char A[MAX],i;//i被定义为unsigned char
    for (i=0;i<=MAX;i++)
    A[i]=i;
}
解答:死循环加数组越界访问(C/C++不进行数组越界检查)
MAX=255
数组A的下标范围为:0..MAX-1,这是其一
其二当i循环到255时,循环内执行:
A[255]=255;
这句本身没有问题但是返回for (i=0;i<=MAX;i++)语句时,
由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去. 6、请问一下程序将输出什么结果?
char *RetMenory(void)
{
    char p[] = “hellow world”;
    return p;
}
void Test(void)
{
    char *str = NULL;
    str = RetMemory();
    printf(str);
}
    RetMenory执行完毕,p资源被回收,指向未知地址。返回地址,str的内容应是不可预测的, 打印的应该是str的地址 7、对下面程序进行分析
void test2()
{
    char string[10], str1[10];
    int i;
    for(i=0; i<10; i++)
    {
        str1[i] = 'a';
    }
    strcpy( string, str1 );
}
解答:字符数组str1不能在数组内结束strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性指出库函数strcpy工作方式str1不能在数组内结束:因为str1的存储为:{a,a,a,a,a,a,a,a,a,a},没有'