【APP逆向12】C语言基础

  • 1.字符串相关
    • C语言中没有字符串,用 字符数组 创造出字符串出来。
# include <stdio.h>
# include <string.h>

int main(int argc, char const *argv[])
{
    // 字符类型,用1个字节来存储。
    char v1 = 'w';
    printf("v1: %c\n", v1);

    // 字符数组 -> 字符串
    char v2[8] = {'x','i','a','o','w','l','i','\0'};
    printf("v2: %s\n", v2);

    // 字符数组, sizeof大小
    char v3[] = "xiaowli";
    int length = sizeof(v3)/sizeof(char);
    printf("v3: %s,长度为:%d\n", v3, length);

    // 字符数组
    char v4[] = "周杰伦";
    int len = sizeof(v4)/sizeof(char);
    printf("v4: %s,长度为:%d\n", v4, len);

    // 字符串长度
    unsigned long dataLen = strlen(v4);
    printf("Length: %d\n", dataLen);

    return 0;
}

//v1: w
//v2: xiaowli
//v3: xiaowli,长度为:8
//v4: 周杰伦,长度为:10
//Length: 9
  • 2.数组相关
    • 对于数组来说,内部元素是挨个存放,内存地址相邻;
    • 元素固定;
    • 类型固定。
# include <stdio.h>

int main(int argc, char const *argv[]) {
    int v3[] = {11, 22, 33, 44, 55, 66};  // 每个整型4字节
    printf("第0个位置值:%d,内存地址:%p \n", v3[0], &v3[0]); // 值所在的内存地址 0x00000
    printf("第1个位置值:%d,内存地址:%p \n", v3[1], &v3[1]); // 0x00004
    printf("第2个位置值:%d,内存地址:%p \n", v3[2], &v3[2]); // 0x00008
    return 0;
}
  • 数组变量,也是(指向)也是数组第一个元素的内存地址。
# include <stdio.h>

int main(int argc, char const *argv[]) {

    // 字符数组
    char v3[] = {'x', 'w', 'l', 'i', 'a', 'n', 'g'};
    printf("v3的值为: %p \n", v3);
    printf("v3的值为: %p \n", &v3);
    printf("v3的值为: %p \n", &v3[0]);
    printf("v3的值为: %p \n", &v3[1]);

    return 0;
}

  • 3.指针(重点)
    • 3.1:什么是指针?
      • 指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var_name;
      • 在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var_name 是指针变量的名称。用来声明指针的星号 *
    • 3.2:示例1
#include <stdio.h>

int main() {

    int v1 = 666;
    int* v2 = &v1;

    printf("v1对应的值:%d,内存地址是:%p \n", v1, &v1);
    printf("v2对应的值:%p,内存地址是:%p \n", v2, &v2);

    return 0;
}
  • 3.3:示例2,通过指针获取对应的值并且修改
    • 如果你有一个指针类型的变量v2,内部存储肯定是内存地址,如何获取次内存地址中存储的值呢?
    • 注意:&变量,获取变量指向数据的内存地址。*变量,根据变量中存储的内存地址去获取次内存地址中存储的值。
#include <stdio.h>

int main() {

    int v1 = 666;
    int* v2 = &v1;
    int* v3 = &v1;

    v1 = 999;
    printf("v2指针关联的值:%d \n", *v2); //999
    printf("v3指针关联的值:%d \n", *v3); //999

    *v2 = 888;
    printf("v1的值:%d \n", v1);
    printf("v2指针关联的值:%d \n", *v2); //888
    printf("v3指针关联的值:%d \n", *v3);

    return 0;
}
  • 3.4:指针类型也支持计算
#include <stdio.h>

int main() {

    char v34[] = {'a', 'e', 'x'};
    char *v28 = v34;
    //char *v28 = &v34;

    printf("v34的值:%c,内存地址:%p \n", v34[0], &v34[0]);
    printf("v34的值:%c,内存地址:%p \n", v34[1], &v34[1]);
    printf("v34的值:%c,内存地址:%p \n", v34[2], &v34[2]);
    
    printf("v28的值:%p,对应地址的值:%c \n", v28, *v28);
    v28 += 1;
    printf("v28的值:%p,对应地址的值:%c \n", v28, *v28);
    v28 += 1;
    printf("v28的值:%p,对应地址的值:%c \n", v28, *v28);
    return 0;
}
  • 3.5格式化
#include <stdio.h>

int main() {
    char v34[10]; // ['6','1','7','3','6','2',,,,,]
    char *v28 = v34;   
    // 格式化:
    sprintf(v28, "%02x", 'a'); // 'a' -> ascii  97  ->  "61" -> ['6','1']

    v28 += 2;
    sprintf(v28, "%02x", 's'); // 115

    v28 += 2;
    sprintf(v28, "%02x", 'b'); // 98

    printf("值为:%s", v34);
    return 0;
}
  • 3.6:判断子序列
#include <stdio.h>
#include <string.h>

int main() {
    char name[] = "xwliang";
    
    // 判断是name中是否存在子序列li
    char *res = strstr(name, "pe");
    
    if (res == NULL) {
        printf("不存在");
    }else{
        printf("存在,从位置 %p 匹配成功的\n",res);
    }

    return 0;

}
  • 3.7:开辟内存
#include <stdio.h>
#include <string.h>
#include<stdlib.h>

int main() {
    char name[] = "xwliang";
    printf("原来的的内容为:%s,内存地址:%p  \n", name, name);

    // 开辟内存  "xwliang"
    char *newName = malloc(strlen(name) + 1);

    strcpy(newName, name); // 拷贝
    printf("拷贝后的内容为:%s,内存地址:%p\n", newName, newName);
    return 0;
}
  • 3.8:复制与拼接
#include <stdio.h>
#include <string.h>
#include<stdlib.h>


int main() {
    char name[] = "json";
    char role[] = "sb";

    //char v23 = [11];  
    char *v23 = malloc(strlen(name) + strlen(role) + strlen(name) + 1);
    strcpy(v23, name);
    strcat(v23, role);


    char *v24 = v23;
    strcat(v24, name);

    printf(v23);  //jsonsbjson
    return 0;
}
posted @ 2024-02-04 21:51  Tony_xiao  阅读(42)  评论(0编辑  收藏  举报