Массив сохраняет данные между вызовами функций в C - PullRequest
0 голосов
/ 25 декабря 2018

Почему данные сохраняются для второго вызова, когда я не использовал static?

Вот код, вывод и то, что я ожидал, вывод должен быть.

#include <stdio.h>

void fun(int len)
{
  int arr[10];
  int i;

  for (i = 0; i < len; i++)
    arr[i] = (i+1) * 10;

  for (i = 0; i < 10; i++)
    printf("%d ", arr[i]);

  printf("\n");
}

int main(void) {
  fun(10);
  fun(4);

  return 0;
}

вывод:

10 20 30 40 50 60 70 80 90 100 
10 20 30 40 50 60 70 80 90 100

ожидаемый вывод:

10 20 30 40 50 60 70 80 90 100 
10 20 30 40 0 0 0 0 0 0 

Ответы [ 4 ]

0 голосов
/ 25 декабря 2018

массив arr [] размещен в стеке, который по умолчанию неинициализирован, значения являются теми, которые использовались в прошлый раз, когда была выделена эта область, в этом случае происходит выделение одной и той же области стека между двумя забавными вызовами и областью стекабыл инициализирован первым вызовом.

0 голосов
/ 25 декабря 2018

int arr[10]; объявляет массив из 10 int элементов в стеке.Его элементы неинициализированы.Если вы попытаетесь получить к ним доступ без инициализации, как в случае с fun(4), вы можете увидеть значения мусора, вы можете увидеть старое содержимое памяти (как вы это делали здесь), или вы можете аварийно завершить программу с ошибкой сегментации, еслистраница памяти принадлежит другой программе.Вы даже можете получить ожидаемый результат!Фактически, может произойти все что угодно, потому что поведение не определено спецификацией.

Чтобы соответствовать вашим ожиданиям, инициализируйте массив любым способом, который вы выберете, например, одним из следующих:

int arr[10] = {};
int arr[10] = {0};
int arr[10];
memset(arr, 0, sizeof(int) * 10);
int arr[10];

for (int i = 0; i < 10; i++) {
    arr[i] = 0;
}

и т. Д.

0 голосов
/ 25 декабря 2018

Вы вызываете неопределенное поведение, обращаясь к неинициализированной памяти.Результатом может быть буквально все, что угодно, включая то, что ваш компьютер растёт и убегает.

На практике, вероятно, происходит то, что ваши вызовы функций занимают одно и то же место в стеке, так как нет других вызовов между или внутриих.Переменная arr попадает в одно и то же место в стеке оба раза.Первая инициализация является более полной, чем вторая, поэтому вы не видите всего мусора.Этого следовало ожидать, но, безусловно, никогда не полагался.

0 голосов
/ 25 декабря 2018

Пожалуйста, инициализируйте массив.

Как это

void fun(int len)
{
  int arr[10] = {0};  //changed
  int i;

  for (i = 0; i < len; i++)
    arr[i] = (i+1) * 10;

  for (i = 0; i < 10; i++)
    printf("%d ", arr[i]);

  printf("\n");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...