C语言malloc初始化问题

前言

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

## 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;
}

结果就是:
C语言malloc初始化问题_第2张图片
真是百思不得其解!!!!

讲道理,是不需要为‘\0’预留空间的,但是为什么呢?
C语言malloc初始化问题_第3张图片

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

你可能感兴趣的:(C)