Задать вопрос
@Anther
Начинающий

Почему значения меняются?

код на C.

#include<stdlib.h>
#include<stdio.h>
#include<time.h>


int * getMas(int n){
	int mas[n];

	int i;
	for(i = 0; i < n; i++)
	{
		mas[i] = rand() % 100;
	}

	int *ptr = mas;
	return ptr;
}

void main()
{
	srand(time(NULL));
	int n = 10;
	int * ptr = getMas(n);
	printf("first  %d %d %d %d ", ptr[0], ptr[1], ptr[3], ptr[4]);
	printf("\n");
	printf("second %d %d %d %d ", ptr[0], ptr[1], ptr[3], ptr[4]);

}


значения я не менял, то есть 2 принта должны вывести одно и тоже, но в первом случае он выводит валидные данные, а в другом мусор

// first  14 63 38 39
// second 1 32762 32762 1
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@res2001
Developer, ex-admin
Потому что массив так нельзя вернуть из функции. Сейчас вы просто возвращаете указатель. Пока указатель находится в функции getMas он действительно указывает на массив. Как-только вы вышли из getMas стек схлопнулся (ваш массив находится на стеке) и память, где раньше лежал массив стала не действительной.
После вызова первого printf, та же память на стеке, которую когда-то занимал ваш массив выделилась под нужды printf, и printf заполнила эту память чем-то своим, поэтому в третьем printf у вас фигня.
Программа у вас не вываливается с ошибкой, потому что в стеке память всегда выделена. "Схлопывание стека" - это просто уменьшение/увеличение регистра указателя на стек.

У вас есть 2 вариант.
1. Простой - выделить массив в main, передать его в getMas. Из getMas уже можете ничего не возвращать, только заполняете там массив.
2. Выделяете динамический массив в getMas с помощью malloc. В main не забудьте освободить память, выделенную для массива. Это плохой вариант, т.к. память выделяется на одном уровне программы, а освобождается на другом. Но в вашей простой задаче можно пока на это не обращать внимания.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Вы возвращаете висячий указатель, поэтому возникает неопределённое поведение
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы