Вы возвращаете указатель на локальную переменную.
k
создается в стеке. Когда cal()
выходит, стек разматывается, и эта память освобождается. Ссылка на эту память впоследствии приводит к неопределенному поведению (как прекрасно объяснено здесь: https://stackoverflow.com/a/6445794/78845).
Ваш компилятор C ++ должен предупредить вас об этом, и вы должны учитывать эти предупреждения.
Что бы это ни стоило, вот как я реализовал бы это в C ++:
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
int main()
{
int a[] = {5, 6, 7, 8, 9};
int b[] = {0, 3, 5, 2, 1};
int c[5];
std::transform (a, a + 5, b, c, std::minus<int>());
std::copy(c, c + 5, std::ostream_iterator<int>(std::cout, ", "));
}
Смотри, беги!