精华内容
下载资源
问答
  • c语言可变数组的实现

    2021-01-13 00:17:36
    一个可以提供可变长度数组的函数 1、可以自增长 2、可以得到当前长度 3、可以获取元素 the interface,定义以下函数库 实现: array.h头文件 #ifndef STUDENTS_ARRAY_H #define STUDENTS_ARRAY_H const ...

    下一篇:c语言链表一个可以提供可变长度数组的函数

    1、可以自增长

    2、可以得到当前长度

    3、可以获取元素

     

    the interface,定义以下函数库

    实现:

    array.h头文件

    #ifndef STUDENTS_ARRAY_H

    #define STUDENTS_ARRAY_H

    const BLOCK_SIZE=20;//把数组每份划分为20个大小,便于动态增长数组大小

    typedef struct {

        int *array;

        int size;

    }Array;//这里我们最好不写*Array,这样写会定义出一个指针,虽然这样写传入函数很方便,但是我们创建不了本地结构变量,因为这样的结构变量一定是由某个东西制造出来的(例如malloc

    //且可读性差,不知道的人Array a会可能不会当做一个指针

    Array array_create(int init_size);

    void array_free(Array *a);

    int array_size(const Array *a);

    int* array_at(Array *a,int index);

    void array_inflate(Array *a,int more_size);

    #endif //STUDENTS_ARRAY_H

     

    main.c

    #include <stdio.h>

    #include "array.h"

    #include <stdlib.h>

    //    typedef struct {

    //        int *array;

    //        int size;

    //    }Array;  这里是作为写代码的参考

    Array array_create(int init_size){

        Array  a;

        a.size=init_size;

        a.array=(int *)malloc(sizeof(int )*init_size);

        return a;//为什么不返回Array*?因为会使得使用Array比较复杂

    }

    void array_free(Array *a){

        free(a->array);//释放结构体中的数组array

        a->array=NULL;//这么写可以防止别人free两次,因为NULL是可以free

        a->size=0;

    }

    //为什么不直接a.size还要写个函数,主要是封装,避免别人能够直接拿size来用,不过这是后面复杂化之后的东西了

    int array_size(const Array *a){

        return a->size;

    }

    int* array_at(Array *a,int index){//这个函数可以用一对getset来代替

        //如果越界

        if (index >= a->size){

    //        array_inflate(a,index-a->size+1);这样每次越界,只增加1个容量,不划算,因为每次扩容都要遍历数组

            array_inflate(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);//这个计算是这样的

            //index/BLOCK_SIZE+1得到当前index所在的块,再乘以BLOCK得到新的数组大小,最后减去原来的大小(得到more_size)传入增长函数

        }

        return &(a->array[index]);

    }

    void array_inflate(Array *a,int more_size){

        //申请一块更大的空间

        int *p=(int *)malloc(sizeof(int)*(a->size+more_size));

        //a中的数据拷贝过去

        for (int i = 0; i < a->size; ++i) {//这个循环可以用void *memcpy(void *str1, const void *str2, size_t n)这个函数代替

            p[i]=a->array[i];

        }

        //释放原来的数组

        free(a->array);

        //将新的数组交给a

        a->array=p;

        a->size += more_size;

    }

     

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

    {

        Array a=array_create(100);

        printf("%d\n",array_size(&a));

        *array_at(&a,102)=1001;

        printf("%d\n",*array_at(&a,102));

        array_free(&a);

        return 0;

    }

    这里创建了100个大小的数组,我们给102号赋值,这个可变数组自动增长了

    并且赋值成功,并打印了出来

     

    缺点:

    每次增大数组都要做一遍copy

    可能出现明明空间够,但是申请不到新的空间的情况,因为增长需要在原有的空间基础上再申请一块更大的空间,申请后才能释放原有的空间

     

    代码格式化版

    实现:
    array.h头文件
    #ifndef STUDENTS_ARRAY_H
    #define STUDENTS_ARRAY_H
    const BLOCK_SIZE=20;//把数组每份划分为20个大小,便于动态增长数组大小
    typedef struct {
        int *array;
        int size;
    }Array;//这里我们最好不写*Array,这样写会定义出一个指针,虽然这样写传入函数很方便,但是我们创建不了本地结构变量,因为这样的结构变量一定是由某个东西制造出来的(例如malloc)
    //且可读性差,不知道的人Array a会可能不会当做一个指针
    Array array_create(int init_size);
    void array_free(Array *a);
    int array_size(const Array *a);
    int* array_at(Array *a,int index);
    void array_inflate(Array *a,int more_size);
    #endif //STUDENTS_ARRAY_H
    
    main.c
    #include <stdio.h>
    #include "array.h"
    #include <stdlib.h>
    //    typedef struct {
    //        int *array;
    //        int size;
    //    }Array;  这里是作为写代码的参考
    Array array_create(int init_size){
        Array  a;
        a.size=init_size;
        a.array=(int *)malloc(sizeof(int )*init_size);
        return a;//为什么不返回Array*?因为会使得使用Array比较复杂
    }
    void array_free(Array *a){
        free(a->array);//释放结构体中的数组array
        a->array=NULL;//这么写可以防止别人free两次,因为NULL是可以free的
        a->size=0;
    }
    //为什么不直接a.size还要写个函数,主要是封装,避免别人能够直接拿size来用,不过这是后面复杂化之后的东西了
    int array_size(const Array *a){
        return a->size;
    }
    int* array_at(Array *a,int index){//这个函数可以用一对get、set来代替
        //如果越界
        if (index >= a->size){
    //        array_inflate(a,index-a->size+1);这样每次越界,只增加1个容量,不划算,因为每次扩容都要遍历数组
            array_inflate(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);//这个计算是这样的
            //index/BLOCK_SIZE+1得到当前index所在的块,再乘以BLOCK得到新的数组大小,最后减去原来的大小(得到more_size)传入增长函数
        }
        return &(a->array[index]);
    }
    void array_inflate(Array *a,int more_size){
        //申请一块更大的空间
        int *p=(int *)malloc(sizeof(int)*(a->size+more_size));
        //将a中的数据拷贝过去
        for (int i = 0; i < a->size; ++i) {//这个循环可以用void *memcpy(void *str1, const void *str2, size_t n)这个函数代替
            p[i]=a->array[i];
        }
        //释放原来的数组
        free(a->array);
        //将新的数组交给a
        a->array=p;
        a->size += more_size;
    }
    
    int main(int argc,char const* argv[])
    {
        Array a=array_create(100);
        printf("%d\n",array_size(&a));
        *array_at(&a,102)=1001;
        printf("%d\n",*array_at(&a,102));
        array_free(&a);
        return 0;
    }
    

     

    展开全文
  • 因为C++下获取动态指针数组长度,使用sizeof函数话,肯定是计算指针字节。而有一些变量使用是float*或者其他类型。。此时应该使用_msize()/data,函数,就可以得到动态数组数据数量
    因为C++下获取动态指针的数组长度,使用sizeof函数的话,肯定是计算的指针字节。而有的一些变量使用的是float*或者其他类型。。此时应该使用_msize()/data,函数,就可以得到动态数组中的数据数量
    
    展开全文
  • 当我们使用c语言读取文件时候,你完全可以使用一个大数组来存放读取内容,但是...首先获取到文件大小确定数组长度c语言中不能像其他语言那样,通过size属性能够直接获取到文件大小,那么我们如何获取...

    当我们使用c语言读取文件的时候,你完全可以使用一个大数组来存放读取的内容,但是这样是不是就造成了很多浪费呢???如果文件内容很大的话,你更不可能使用一个大数组来进行存放了。
    最好的办法是使用动态内存分配,当文件内容很大的时候,你完全可以分多次执行。

    首先获取到文件的大小确定数组长度

    在c语言中不能像其他语言那样,通过size属性能够直接获取到文件的大小,那么我们如何获取到文件的大小能,并且需要用到两种函数:

    ftell(fp); 获取到当前文件指针指向的位置 fseek(fp,0L,SEEK_END); 设置当前文件的指针位置
    fp当前文件指针指向的位置0L表示偏移量这里3个可选参数 
    SEEK_SET 表示文件首位置 也可以用0代替
    SEEK_CUR 表示文件指针当前位置 也可以用1代替
    SEEK_END 表示文件末位置 也可以用2代替

    int filesize(FILE * fp){
        int curpos,length;
        if(fp == NULL){
            return 0;
        }
        curpos = ftell(fp);//记录当前文件指针的位置
        fseek(fp,0L,SEEK_END);//将当前指针移动到文件末
        length = ftell(fp);//当前指针的位置即为文件大小
        fseek(fp,curpos,SEEK_SET);//回到之前指针的位置
        return length;
    }

    在linux系统下还有另一种方法, 就是使用结构体,但是如果使用结构体,这样效率更高

    动态分配内存,存放字符串

    获取到文件大小的主要目的还是为了确定分配多大的内存

    int getStrOnFile(char ** str,char * dir,char * type){
        FILE * file;
        int index = 0;
        if((file = fopen(dir,type)) == NULL){
            printf("文件打开失败\n");
            return 0;
        }
        (*str) = (char *)malloc(filesize(file) + 1);
        while(((*str)[index++] = fgetc(file)) != EOF);
        (*str)[index] = '\0';
        fclose(file);
        return 1;
    }

    main函数

    int main(){
        char * str = NULL;
        getStrOnFile(&str,"d://file.txt","r");
        printf("%s",str);
        free(str); 
    }
    展开全文
  • C语言数组2021.2.21

    2021-02-21 18:41:22
    其中数组类型为C语言中有效任意类型,数组名是数组的首地址,是一个常量,数组长度值大于零。 如一个长度为10的整型一维数组: int arrayname[10] 关于数组的赋值可以有初始赋值,逐个赋值以及动态赋值。 例如初始...

    C 数组
    它可以存储一个固定大小的相同类型元素的顺序集合。
    数组的定义
    数组类型 数组名[数组长度]
    其中数组类型为C语言中有效任意类型,数组名是数组的首地址,是一个常量,数组长度值大于零。
    如一个长度为10的整型一维数组:
    int arrayname[10]
    关于数组的赋值可以有初始赋值,逐个赋值以及动态赋值。
    例如初始赋值int arrayname[10]={1,2,3,4,5},可以只赋值五个,后面的会自动补充为零。
    逐个赋值,通过下标赋值。数组可以通过下标索引获取数组里面的元素,开始下标为零。arrayname[0]=2,也就是第一号元素为2。
    动态赋值,举个例子:
    定义一个数组输入十个元素,并输出最大的元素。

    #include<stdio.h>
    void main()
    {
    int a1[10],i,max;
    printf(“please input the ten integer:”);
    for(i=0;i<=9;i++)
    {
    scanf("%d",&a1[i]);
    }
    max=a1[0];
    for(i=1;i<=9;i++)
    {
    if(a1[i]>max)
    {
    max=a1[i];
    }
    }
    printf(“max=%d\n”,max);
    }
    另外,所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。注意是连续的内存地址。

    展开全文
  • C语言-自我学习-遍历数组

    千次阅读 2018-11-20 18:19:18
    那么如果我获取到这个字节数,然后去除去数组的第一个索引的字节数,就得到了数组长度 得到动态长度就可以开始遍历了 在c中,是没有自动换行的方法,所以需要加上\n int arr[3] = {123, 1231, 123}; size_t size =...
  • JavaScript数组

    2021-01-20 20:11:39
    JS中,数组里可以存放任意类型的元素 一,创建数组 利用new创建数组 ...二,数组的索引(下标),数组元素的获取,遍历数组,与C语言中一致 三,数组长度 数组名.length —动态监测数组元素的个数 var
  • 知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章... ---定义数组的时候必须指定数组长度 ---数组长度是在编译期就必...
  • 动态数组运行时才分配,如有需要,可以通过分配一个更大数组,复制原来值到新数组中,删除原先数组,达到动态改变数组长度的目的 链式结构 很灵活,但链接字段要消耗内存,访问一个特定元素效率不如...
  • array : 动态数组,根据数据项的个数自动扩展数组的长度。 map : 存放key/value映射的容器,方便通过key查找value。 obj : 通用的对象。提供通用的属性设置/获取函数,和事件注册/分发功能。 emitte
  • C语言的科学和艺术.pdf

    热门讨论 2012-01-19 14:09:05
    13.5.2 动态数组 372 13.5.3 查找malloc中错误 373 13.5.4 释放内存 374 小结 374 复习题 375 程序设计练习 377 第14章 再论字符串 381 14.1 string类型概念表示 381 14.1.1 字符串作为数组 382 14.1.2...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    动态数组分配 6.14 如何在运行时设定数组的大小?怎样才能避免固定大小的数组? 6.15 我如何声明大小和传入的数组一样的局部数组? 6.16 如何动态分配多维数组? 6.17 有个很好的窍门,如果我这样写:...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...
  • 1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...
  • len表示字符串的长度; free表示空闲的,未分配的空间; buffer数组是真正的字符串,并且以'\0'结尾。 现在我们对比一下他们的差异,这也是一个出镜率很高的面试题。 1,SDS获取字符串长度复杂度O(1),而C的...
  • C语言常用算法

    2012-03-28 10:48:37
    014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较...
  • 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较...
  • C语言学习实例220例

    2015-06-16 23:47:59
    c语言开发实例目录: 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 009 乘法口诀表 010 猜数字...
  • 7.7 指针与数组的关系 159 7.8 指向数组的指针 162 7.9 void类型、指向void类型的指针与空指针 165 7.10 字符数组与字符串字面量 167 7.11 完整与不完整类型 170 7.12 灵活的数组成员 171 7.13 本章小结 173 ...
  • C语言中内存申请函数

    2020-10-03 17:00:18
    用一块连续内存来存储数据,C中有动态申请内存函数malloc,这个函数前后都要参数,从下面程序中就能看到,首先要在前面用(类型 *)格式来指明它指向类型内存,后面是申请内存大小,长度*类型大小。...
  • C语言实例解析精粹

    2014-03-14 21:57:05
    014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较...
  • C语言实例解析精粹 PDF

    热门讨论 2010-08-17 00:20:25
    实例14 求解二维数组的最大/最小元素 实例15 利用数组求前n个质数 实例16 编制万年历 实例17 对数组元素排序 实例18 任意进制数的转换 实例19 判断回文数 实例20 求数组前n个元素之和 实例21 求解钢材切割的最佳订单...
  • C语言字符串是基于数组来实现,每个字符串会多出一个空字符: Redis中简单动态字符串是SDS(simple dynamic string)类型: sds遵循C语言中以空字符为结尾惯例是为了利用C语言函数库中某些字符串函数,...
  • C语言编码哈夫曼树

    2015-06-24 20:51:44
    //向量HT前n个分量表示叶子结点,最后一个分量表示根结点,各字符编码长度不等,所以按实际长度动态分配空间 void Select(HuffmanTree t,int i,int &s1,int &s2) { //s1为最小两个值中序号最小那个 int j...
  • 6.4.2 使用库函数确定字符串的长度 211 6.4.3 使用库函数连接字符串 212 6.4.4 比较字符串 213 6.4.5 搜索字符串 216 6.5 分析和转换字符串 219 6.5.1 转换字符 222 6.5.2 将字符串转换成数值 225 6.7 使用...
  • 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较...
  • 本文为读《Redis设计与实现》的记录。该书以Redis2.9讲解Redis相关内容。请注意版本差异。... //记录buf数组中已使用字节的数量 //获取字符串的长度时,就是直接返回的这个字段的值 int len; ...
  • 即以空格结尾字符数组,简称c字符串。 SDS(simple dynamic string)——简单动态字符串 SDS是redis默认字符串表示。 redis也会用到c字符串,但是只会作为字符串字面量,用在一些不用修改字符串上面。 eg: ...
  • C语言源代码实例.rar

    2009-08-27 20:17:58
    014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

c语言获取动态数组的长度

c语言 订阅