Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

android ndk 03 C语言 动态分配内存,字符串操作

$
0
0

动态分配内存,字符串操作

动态内存分配

在说动态内存分配之前先说下 静态内存分配


void main(){
    //静态内存分派
    int a[1024*1024*10];//申请10m 

    //这样申请会提示堆栈溢出
}

堆内存 栈内存

下面代码 作用 每隔一秒申请40M 内存 看任务管理器 可以看到 别搞死机了,可以把free注释 打开 不过就看不到效果了

//堆内存
void heapFun(){
    //40M内存
    //字节
    //void *任意类型的指针 int 4字节
    int* p = malloc(1024 * 1024 * 10 * sizeof(int));

    //释放
    //free(p);
}


void main(){    
    //在堆内存上,分配40M的内存
    while (1){
        Sleep(1000);    
        stackFun();
    }

    getchar();

}

写个例子01 : 输入一个数 随机生成这个数的长度的数组 并打印


void main(){
    //静态内存分配创建数组,数组的大小是固定的
    //int i = 10;
    //int a[i];

    int len;
    printf("输入数组的长度:");
    scanf("%d",&len);

    //开辟内存,大小len*4字节
    int* p = malloc(len * sizeof(int));
    //p是数组的首地址,p就是数组的名称
    //给数组元素赋值(使用这一块刚刚开辟出来的内存区域)
    int i = 0;
    for (; i < len - 1; i++){
        p[i] = rand() % 100;
        printf("%d,%#x\n", p[i], &p[i]);
    }

    //手动释放内存
    free(p);

    system("pause");//用getchar(); 貌似不行
}

image

例子: 输入数组长度,生成数组,再次输入新的数组长度,两个数组合并,再重新生成.使用 realloc 函数 重新分配内存



//realloc 重新分配内存
void main(){
    int len;
    printf("第一次输入数组的长度:");
    scanf("%d", &len);

    /*int* p = (int*)malloc(len * sizeof(int)); */
    int* p = NULL;
    p = (int*)calloc(len, sizeof(int));//不知道咋回事我这里又必须强转了
    int i = 0;
    for (; i < len; i++){
        p[i] = rand() % 100;
        printf("%d,%#x\n", p[i], &p[i]);
    }

    int addLen;
    printf("输入数组增加的长度:");
    scanf("%d", &addLen);
    //内存不够用,扩大刚刚分配的内存空间
    //1.原来内存的指针 2.内存扩大之后的总大小        
    int* p2 = (int*)realloc(p, sizeof(int)* (len + addLen));
    if (p2 == NULL){
        printf("重新分配失败");
    }
    //重新分配内存的两种情况:
    //缩小,缩小的那一部分数据会丢失
    //扩大,(连续的)
    //1.如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针
    //2.如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址
    //3.如果申请失败,返回NULL,原来的指针仍然有效

    //重新赋值
    i = 0;
    printf("--------------------------\n");
    for (; i < len + addLen; i++){
        p2[i] = rand() % 200;
        printf("%d,%#x\n", p2[i], &p2[i]);
    }

    //手动释放内存  这里如果打开的话将会二次释放了 debug下可以看到 p 和p2 的地址是相同的
    /*if (p != NULL){
        free(p);
        p = NULL;
    }*/
    if (p2 != NULL){
        free(p2);
        p2 = NULL;
    }
    system("pause");
}

image

在这里我遇到一个深坑

    //手动释放内存  这里如果打开的话将会二次释放了 debug下可以看到 p 和p2 的地址是相同的
    /*if (p != NULL){
        free(p);
        p = NULL;
    }*/
    if (p2 != NULL){
        free(p2);
        p2 = NULL;
    }

一开始我把两个指针都释放了 结果报错 , 原因: 二次释放了 因为p 和p2的地址是相同的,打印一下就知道了.

字符串操作 字符串例子

字符串例子01 初始化

void main(){

    //1.字符数组初始化

    char ch1[10] = { 'c', 'h', 'i', 'n', 'a','\0' };//\0代表结束

    printf("%s\n", ch1);
    printf("%x#\n", ch1);

    char str[10] = "china";
    printf("%s\n", str);
    printf("%x#\n", str);
    //可以被修改
    str[0] = 's';
    printf("修改后: %s\n", str);
    system("pause");
}

效果图

image

字符串例子02 指针初始化 以及操作

//字符指针
void main(){
    //从内存连续排列
    char *str = "how are you ?";

    //不可以被修改
    //str[0] = 'w';//把这个打开会报错
    printf("%s\n", str);
    printf("%x#\n", str);

    //使用指针加法,截取字符串
    str += 3;
    while (*str)
    {
        printf("%c", *str);
        str++;
    }
    printf("\n字符串截取完成\n");
    getchar();
}

iamge


下面是c语音 用于操作字符串的函数 以及网站速查


//strcat字符串拼接函数
//在线API文档:
//http://www.kuqin.com/clib/string/strcpy.html
/*
void main(void){
    char dest[50];  
    char *a = "china";
    char *b = " is powerful!";
    strcpy(dest, a);
    strcat(dest, b);
    printf("%s\n", dest);

    system("pause");
}
*/

//strchr在一个串中查找给定字符的第一个匹配之处
/*
void main(void){
    char *str = "I want go to USA!";
    printf("%#x\n", str);
    //U元素的指针
    //str+3
    char* p = strchr(str, 'w');
    if (p){
        printf("索引位置:%d\n", p - str);
    }
    else{
        printf("没有找到");
    }

    system("pause");
}
*/

//strstr 从字符串haystack中寻找needle第一次出现的位置

void main(void){
    char *haystack = "I want go to USA!";
    char *needle = "to";
    //U元素的指针

    char* p = strstr(haystack, needle);
    if (p){
        printf("索引位置:%d\n", p - haystack);
    }
    else{
        printf("没有找到");
    }

    system("pause");
}
作者:liudao7994 发表于2017/8/7 16:17:46 原文链接
阅读:22 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>