对二维数组传参和指针的理解


#include 
#include 
#include 
#include 
char* convertandmerge (char a[][20])
{
    char *p=(char*)malloc(sizeof(char)*40);
    p=strcat(a[0],a[1]);
    for(;*p!='\0';p++)
    {
         if(*p>='a'&&*p<='z')
        *p=toupper(*p);
    else if(*p>='A'&&*p<='Z')
        *p=tolower(*p);    
    }
    return p;
}

int main (void)
{
    char words[2][20]={"Welcome to China","Happy Birthday 2022"};
    char *str=convertandmerge(words);
    printf("%s",str);
    free(str);
}

为什么我函数里插入了一段大小写转换的for循环整个程序就跑不起来了呢?应该如何改呢?求指正,谢谢。

返回的p指针已经指向字符串的最后了,打印输出不了内容,源数据指针、for循环偏移的指针,需要两个,改进如下:

char* convertandmerge (char a[][20])
{
    char *q=(char*)malloc(sizeof(char)*40);
    q=strcat(a[0],a[1]);
    for(char *p=q;*p!='\0';p++)
    {
         if(*p>='a'&&*p<='z')
        *p=toupper(*p);
    else if(*p>='A'&&*p<='Z')
        *p=tolower(*p);
    }
    printf("==== %s\n", q);
    return q;
}

内存溢出了。strcat函数返回的指针是第一个参数,不是新分配的内存,所以for循环的时候超过20就溢出了