C语言malloc初始化问题

前言

博主在刷Leetcode的时候经常头疼的是数组初始化问题。尤其是最近,经常会遇到数组访问溢出的问题。
在这里插入图片描述
大意就是说访问数组下标越界了,简直头疼得不得了。
今天就结合例子来总结一下:

## 1374. 生成每种字符都是奇数个的字符串

在这里插入图片描述
假如我们这样的话:
(注意看malloc那一行代码)

char * generateTheString(int n){

    //if(n == 0) return ;
    //第一种初始化方法
    //char* res = malloc((n+1) * sizeof(char));
    //memset(res , 0 , (n+1) * sizeof(char));
    char*  res = malloc(n * sizeof(char));
    memset(res, 0, n * sizeof(char));

    //第二种初始化方法,会报错数组访问内存溢出
    //char *res = (char*)calloc(n+1, sizeof(char)); 


    
    //char res[n];
    int i = 0;
    if(n%2 == 0){
        while(i<n-1){
            res[i++] = 'a';
        }
        res[n-1] = 'b';
    }else{
        while(i < n){
            res[i++] = 'a';
        }
    }
    return res;
}

使用这样初始化res数组:

    char*  res = malloc(n * sizeof(char));
    memset(res, 0, n * sizeof(char));

结果就是:一片红,系统提示数组访问溢出。



但是,如果改为这样的话:

    char* res = malloc((n+1) * sizeof(char));
    memset(res , 0 , (n+1) * sizeof(char));

也就是全部代码为:

char * generateTheString(int n){

    //if(n == 0) return ;
    //第一种初始化方法
    char* res = malloc((n+1) * sizeof(char));
    memset(res , 0 , (n+1) * sizeof(char));
    //char*  res = malloc(n * sizeof(char));
    //memset(res, 0, n * sizeof(char));

    //第二种初始化方法,会报错数组访问内存溢出
    //char *res = (char*)calloc(n+1, sizeof(char)); 


    
    //char res[n];
    int i = 0;
    if(n%2 == 0){
        while(i<n-1){
            res[i++] = 'a';
        }
        res[n-1] = 'b';
    }else{
        while(i < n){
            res[i++] = 'a';
        }
    }
    return res;
}

结果就是:
在这里插入图片描述
真是百思不得其解!!!!

讲道理,是不需要为‘\0’预留空间的,但是为什么呢?
在这里插入图片描述

如果有知道的朋友欢迎指点!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值