Переменные, определенные внутри функции, имеют только время жизни этой функции. Как только функция возвращается, переменные по существу перестают существовать.
Теперь, если вы вернете указатель на такую переменную (или на первый элемент массива, как вы), и эти данные больше не будут существовать, тогда вы получите неопределенное поведение когда вы пытаетесь использовать указатель.
Один из способов решения такой проблемы - передать массив (или, опять же, указатель на его первый элемент) в качестве аргумента функции:
void main2(My *j)
{
j[0].x = 2;
// And so on...
}
А чтобы передать массив в функцию, помните, что массивы распадаются на указатели на их первый элемент при использовании в контексте, где ожидается указатель.
Это означает, что вы можете передать его, как и любую другую переменную:
My arr[3];
main2(arr); // equal to main2(&arr[0]);
В другом примечании формат для печати указателя с использованием printf
равен "%p"
. Указатель также должен быть приведен void *
:
printf("%p\n", (void *) j);