C语言 递归函数后出现空闲内存数组错误

np8igboo  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(135)

这是我的代码,递归操作应该创建数组3,(动态)并从数组1中取出一个字母,从数组2中取出第二个字母,直到其中一个数组结束.这对我来说很有效,但是当我试图释放第三个动态创建的数组时,我得到了一个错误消息,代码是:

void Mirage(char list1[], char list2[], char list3[], int m, int n);
int main()
{
    char array[7] = { 'a','b','c','d','e','f','g' };
    char array2[3] = { 'T','Z','W' };
    char *array3 =(char*) malloc(sizeof(array)+sizeof(array2));
    Mirage(array, array2, array3, 7, 3);
    printf("%s", array3);
    free((void*)array3);

    
}

void Mirage(char list1[], char list2[], char list3[], int m, int n)
{
    if ((m <= 0) && (n <= 0)){
        list3[m + n] = 0;
        return;
    }
        else if (m >= 0 && n <= 0)
        {
            list3[0] = list1[0];
            Mirage(list1 + 1, list2, list3 + 1, m - 1, n);
        }
        else if (m <= 0 && n >= 0)
        {
            list3[0] = list2[0];
            Mirage(list1, list2+1, list3 + 1, m, n-1);
        }
        else
        {
            list3[0] = list1[0];
            list3[1] = list2[0];
            Mirage(list1 + 1, list2 + 1, list3 + 2, m - 1, n - 1);
        }
}

错误:x1c 0d1x
为什么我会得到它?非常感谢!

kkbh8khc

kkbh8khc1#

您将把数组array3输出为包含一个字符串

printf("%s", array3);

但您没有为数组array3中的终止零字符'\0'保留空间

char *array3 =(char*) malloc(sizeof(array)+sizeof(array2));

你必须写

char *array3 = malloc( sizeof( array ) + sizeof( array2 ) + 1 );

该函数应声明为

void Mirage( const char list1[], const char list2[], char list3[], size_t m, size_t n);

也就是说,参数list1list2应该有限定符const,因为数组在函数中没有改变。并且数组的大小应该有size_t类型。
该函数可通过以下方式定义

void Mirage( const char list1[], const char list2[], char list3[], size_t m, size_t n)
{
    if ( m != 0 )
    {
        *list3++ = *list1++;
        --m;
    }

    if ( n != 0 )
    {
        *list3++ = *list2++;
        --n;
    }
           
    if ( m == 0 && n == 0 )
    {
        *list3 = '\0';
    }
    else
    {  
        Mirage( list1, list2, list3, m, n );
    }
}

free的调用可以写得更简单

free( array3 );

相关问题