Rückst du deinen Code eigentlich nicht ein? Ich hätte ja Code-Tags eingefügt, damit die Einrückung nicht verloren geht, aber da war nichts, was verloren gehen könnte.
Und *(matC+i) ist eine etwas umständliche Schreibweise für matC. Ich denke, mit konsequenter Verwendung der Arrayschreibweise wäre dein Code um einiges übersichtlicher.
Ich glaube übrigens nicht, dass die Umstellung von int auf double das grundsätzliche Problem gelöst hat, dass die Werte in matC nicht initialisiert sind. Wenn du mit new ein double-Array anforderst, stehen da irgendwelche Werte drin. Bei matA und matB ist da ja noch kein Problem, weil du die Werte direkt aus den Benutzereingaben setzt. Aber bei matC addierst du nur auf die uninitialiserten Werte drauf.
Der Funktionsaufruf würde in etwa so aussehen:
multi(matA, matB, matC, n, m, l);
Einen Rückgabewert braucht die Funktion nicht, das Ergebnis steht ja in matC. Der Rückgabetyp könnte also void sein.