Ниже приведены два фрагмента кода. Один работал правильно, но другой провалился.
Основная функцияПередача и возврат массивов (код C)
int main
{
int *x,*y,n,*c;
//some code
c=myfunc(x,y,n);
//rest code
}
Вот код, который работал:
int * myfunc(int *a, int *b, int n)
{
int *s,i,*t;
for(i=0;i<n;i++)
s[i]=x[i]+y[i];
t=s;
return s;
}
А вот код, который не работает
int * myfunc(int *a, int *b, int n)
{
int s[100],i,*t;
for(i=0;i<n;i++)
s[i]=x[i]+y[i];
t=&s[0];
return t;
}
Что здесь происходит, что даже несмотря на то, возвращаемое значение является правильным адресом (проверено и проверено), содержимое, похоже, было модифицировано самостоятельно. Однако это не похоже на первый сценарий.
Не только это, но и весь массив s [100] имеет различное содержимое в конце выполненного запроса. Что в основном означает, что содержимое всех этих адресов становится модифицированным из-за какой-то случайной причины.
--Edit--
Вопрос в прямом выражении:
Почему содержимое s при инициализации как s [100] сбрасывается после возврата и где в качестве содержимого s при инициализации как * s не сбрасывается. Обратите внимание: я не использовал malloc() или функции, которые имеют какое-либо отношение к стекам в любом месте моего кода.
** Компилятор использовался был Turbo C **.
Этот вопрос не совсем подходит к моему запросу. Мое сомнение в том, почему работает инициализация * s, а не s [100]. Остальная часть моего кода просто такая же. Не используется функция malloc(), без осложнений. – n0tty
См. Мой другой комментарий. В обоих случаях, насколько мы можем видеть (кроме скрытой, сверхсекретной инициализации 'int * s'), у вас есть неопределенное поведение. Нет никаких оснований ожидать, что любая версия сделает что-нибудь в частности. Переместите некоторый код вокруг, переупорядочите некоторые вызовы функций, другая версия может теперь * отображаться * работать. Ни * * * не должен * работать по какой-либо веской причине. –
Извините за секретную инициализацию lol ... Я думал, что это будет просто кусок нежелательного кода, потому что в нем ничего особенного не делается. Добавлена целая функция в вопросе. Спасибо – n0tty