Когда функция завершается, все ее автоматические переменные выходят за пределы из области действия .
tab
- это автоматическая переменная в этом случае, и она выйдет из области видимости после завершения функции.Теперь вы возвращаете указатель в локальный массив , поэтому, когда массив выходит из области видимости, вы окажетесь с висящим указателем .
Разве ваш компилятор не предупреждал вас об этом?В GCC я получил это предупреждение:
warning: function returns address of local variable [-Wreturn-local-addr]
return tab;
^~~
Сначала убедитесь, что вы действительно хотите для практики создания массива в функции.Если нет, то вам не нужно, вы можете просто создать в main, а затем передать его функции.
Но, если вы хотите попрактиковаться, то вам нужно динамически распределить массив, еслиВы действительно хотите, чтобы он оставался в живых после завершения функции.В этом случае массив освободит свою память, только когда вы скажете это (поэтому никогда не забывайте освобождать).
Пример:
#include <stdio.h>
#include <stdlib.h>
int* tabinit(int size) {
int *tab = malloc(size * sizeof(int));
for (int i = 0; i < size; i++)
tab[i] = 0;
return tab;
}
int main() {
int* t = tabinit(10);
for (int i = 0; i < 10; i++)
printf("%d ", t[i]);
printf("\n");
// do NOT forget to free
free(t);
return 0;
}
Вывод:
0 0 0 0 0 0 0 0 0 0
PS: Когда вы познакомитесь с malloc()
, я предлагаю вам прочитать это: Должен ли я проверить, если malloc ()был успешным?