Как убрать мусор из char массива?
Что у вас за операция пересечения?

Первая проблема - вы берете максимальную длину двух строк в size и потом проходитесь циклом до size по обеим строкам. Но ведь более короткой строки там просто нет - вы обращаетесь к не вашей памяти.

Вам надо проверять, есть ли обе строки по индексу i, прежде чем сравнивать их.

Вторая проблема - вы создаете result размером ровно на количество совпадений, а пишете туда в цикле до size. Т.е. если у вас вообще ни одного совпадения, то массив result будет пустым, но вы там можете хоть 10000-ый элемент записать, если строки достаточно длинные.
Ты промахнулся. Тебе сначала надо выделить строковую переменную, длинна которой будет соответствовать максимальной длине твоих исходных строк (либо первой, либо второй). Далее, тебе надо пройтись про строкам сверяя их символы, но надо следить чтоб индекс не превышал длину минимальной из двух строк. Если превышает, то заполнять ее символами '_';

Не пример для подражания
#include <stdlib.h>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str1 = "hello";
    string str2 = "hola";
    size_t minStrSize = min(str1.size(), str2.size());
    size_t maxStrSize = max(str1.size(), str2.size());
    string result;
    
    if (str1.size() > str2.size())
    {
        result = str1;
    }
    else
    {
        result = str2;
    }
    
    for (size_t i = 0; i < maxStrSize; i++)
    {
        if (i < minStrSize)
        {
            if (str1[i] != str2[i])
            {
                result[i] = '_';
            }
        }
        else
        {
            result[i] = '_';
        }
    }
    
    cout << result;

    return 0;
}
