刷题笔记(C)

申请内存

  1. 二维字符串数组:char **res=calloc(res_size,sizeof(char*))

  2. 几种申请的区别,malloc/calloc/realloc

  3. void* malloc(int n);//直接申请n大小的内存,且不进行初始化
    void* calloc(int n,int size);//申请的是n*size 的内存,且进行初始化,即置0
    void* realloc(void* p,int n);//p是已经指向堆内的一个指针,根据其指向空间与所需要的n对比,看是扩大还是缩小。他也不进行初始化
    void free(void* ptr);//释放指针。
    对于malloc和realloc,如果要进行初始化,需要使用memset
    void *memset(void *s, int v, size_t n);//s是一个指针,也可以是数组名;v是要填充的值;n是要填充的数量。
    
    
  4. 一维数组就没啥好说的,可以用上边的方法申请内存,也可以char temp[40];

  5. 字符数组或者申请内存肯定是较大的,当结束后在末尾加‘\0’作为字符串,再利用strcpy(res[i],temp),就可以把temp这个一维字符数组构成的字符串放到res的第i个数组里。strcpy的两个参数都是char*指针

  6. 要弄清楚sizeof和strlen的区别。sizeof常用于calloc分配内存和memset初始化。

    char *cur=source[i];
    int length=strlen(cur);//求长度
    
    emp[temp_pos]='\0';
    res[res_pos]=calloc(temp_pos+1,sizeof(char));//求分配大小
    strcpy(res[res_pos],temp);
    
  7. memset没那么简单,

    1.
    struct data
    {
    char num[100];
    char name[100];
    int n;
    };
    struct data a, b[10];
    memset( &a, 0, sizeof(a) ); //注意第一个参数是指针类型,a不是指针变量,要加&
    memset( b, 0, sizeof(b) ); //b是数组名,就是指针类型,不需要加&
    2.
    我们用memset给str初始化为“00000000”,用法如下
    char str[9];
    memset(str,0,8);
    注意,memset是逐字节拷贝的。
    3.
    int num[8];
    我们用memset给str初始化为{1,1,1,1,1,1,1,1},
    memset(num,1,8);//这样是不对的
    一个int是4个字节的,8个int是32个字节,所以首先要赋值的长度就不应该为8而是32。
    因为memset是逐字节拷贝,以num为首地址的8字节空间都被赋值为1,
    即一个int变为0X00000001 00000001 00000001 00000001,显然,把这个数化为十进制不会等于1的。
        
    !!!所以,在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。
    
  8. errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n),跟memset相比,多了第二个参数,代表能设置的最大值,一般是设置和第四个参数n相同。

  9. 在函数外边写的int res=0是不会进行初始化的,在函数内部还要再写一次res=0。调了1一个小时才找到

  10. int nums[2][3]={{0,1},{2,0},{3,1}};这是初始化一个二维数组,传入时传的是int** nums,但用的时候还得转换一下,int(*grid)[numsSize] =(int*)nums;其中numsSize是他的行数,列可以不管。此时才能使用grid【i】【j】去实现调用。

  11. sizeof只能用于自己刚定义的内容,引用传过来的都不行,这也是为什么传数组的时候都要传大小。一个例外是传char *的时候,因为可以通过\0来判断长度,所以可以用strlen(char* c )这个api来算长度。

  12. 出现XXX找不到,是因为访问了无法确定的错误,因为设置的数组过大了,访问到别的地方去了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值