第37节 面试题分析

本文主要分析C语言面试中常见的指针运算相关问题,包括必考知识点,并分享宝贵的调试经验和安全编程要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

指针运算
必考知识点

#include <stdio.h>

//二维数组名代表 数组首元素
//二维数组是以一维数组存在的
//指针运算

void main()
{
    int TestArray[5][5] = { {11,12,13,14,15},
                            {16,17,18,19,20},
                            {21,22,23,24,25},
                            {26,27,28,29,30},
                            {31,32,33,34,35}
                          };

    //TestArray[5][5]的位置
    int* p1 = (int*)(&TestArray + 1);   
        
    //TestArray + 1  数组第二个位置 
    //*(TestArray + 1) 数组第二个位置({16,17,18,19,20})的地址
    // (*(TestArray + 1) + 6) 16是第0位,向后移6位是22
    int* p2 = (int*)(*(TestArray + 1) + 6);      

    //*TestArray 代表数组{11,12,13,14,15} ;  *(*TestArray) 代表11
    //*(*(TestArray + 1)) 代表 16
    //TestArray + 3 代表 {26,27,28,29,30} ; *(TestArray + 3) + 3 代表 29的地址
    //p1代表{31,32,33,34,35} p1[-8]代表35向后数8位 是 27
    //p2代表22;p2[4]向后移4位 是 26
    printf("Result: %d; %d; %d; %d; %d\n", *(*TestArray), *(*(TestArray + 1)), 
                                           *(*(TestArray + 3) + 3), p1[-8], 
                                           p2[4]);
}

第二:

调试经验

#include<stdio.h>

void main()
{
    char* p = "hello world!";
    int a = (int)p;
    short s = 'c';

    //int printf (const char *__format, ...) 可变参数
    //可变参数宏无法判断参数的实际类型
    printf("%c\n", (long)(*((int*)p)));//%c只取一个字节  那就只取字符串第一个字节h
    printf("%s\n", a);                 //%s  a代表字符串首地址
    printf("%s\n", &s);                //short类型2个字节  c 0 为字符串
}

第三:

安全编程

#include<stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int flag = 0; 

    char passwd[10];   //这里字符串预定义只有10位

    memset(passwd,0,sizeof(passwd)); 

    strcpy(passwd, argv[1]);           //strcpy函数有可能存在 数组越界 !!!!
    //strncpy(passwd, argv[1],9);      //带n的字符串安全性较高

    if(0 == strcmp("LinuxGeek", passwd)) 
    { 
        flag = 1; 
    } 

    if( flag ) 
    { 
        printf("\n Password cracked \n"); 

    } 
    else 
    { 
        printf("\n Incorrect passwd \n"); 
    } 

    return 0; 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值