Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Обнуление значения static массива после отработки функции.(Си)

kh fjkg Знаток (328), закрыт 3 года назад
После каждой отработки функции появляется новое значение. Мне нужно чтоб после каждой отработки функции значение массива обнулялось.
Массив должен быть static
https://onlinegdb.com/KD9FNzzY0
void func(int *a)
{
static int arr[50]={0};
int *ptr=arr;
ptr[0]=++*a;
printf("%d\n", ptr[0]);
}
int main()
{
int a=1;
func(&a);
func(&a);
func(&a);
}
Лучший ответ
serd Просветленный (20241) 3 года назад
А что именно ты хочешь обнулять? В функции ты перезаписываешь значение первого элемента массива результатом инкрементирования аргумента а, переданного по указателю. Что обнуляй, что не обнуляй массив - результат не изменится.
kh fjkgЗнаток (328) 3 года назад
Почему не обнуляется этот первый элемент массива если сделать так arr[0]=0;
serd Просветленный (20241) kh fjkg, Ты перезаписываешь его значение результатом инкрементирования аргумента а. void func(int *a) { static int arr[50]= { 0 } ; int *ptr=arr; arr[0]=0; ptr[0]=++*a; // ВОТ ТУТ printf("%d\n", ptr[0]); }
kh fjkgЗнаток (328) 3 года назад
void func(int *a)
{
static int arr[50]={0};
int *ptr=arr;
arr[0]=0; //////////////
ptr[0]=++*a;
printf("%d\n", ptr[0]);
}
kh fjkgЗнаток (328) 3 года назад
А, ну да.
Это переменная А ведь "виновата"
kh fjkgЗнаток (328) 3 года назад
А я к массиву пристал
kh fjkgЗнаток (328) 3 года назад
Блииин, это strncpy чудил. Совсем забыл что он нуль терминатор не вставляет.
strncpy_s вставляет.
Остальные ответы
JAMES BOND Ученик (61) 3 года назад
Язык? Именно на С++?
kh fjkgЗнаток (328) 3 года назад
C
Black Гуру (3622) 3 года назад
static по определению сохраняет значения, которые остались после выхода из функции. Хочешь обнуленный массив - убери static или обнуляй его вручную, через цикл или memset
kh fjkgЗнаток (328) 3 года назад
Почему не обнуляется этот первый элемент массива если сделать так arr[0]=0;
Black Гуру (3622) Ну может потому что сразу после обнуления ты записал в него значение ++*a?))
kh fjkgЗнаток (328) 3 года назад
void func(int *a)
{
static int arr[50]= { 0 } ;
int *ptr=arr;
arr[0]=0; //////////////
ptr[0]=++*a;
printf("%d\n", ptr[0]);
}
kh fjkgЗнаток (328) 3 года назад
А, ну да.
Это переменная А ведь "виновата"
А я к массиву пристал
kh fjkgЗнаток (328) 3 года назад
Блииин, это strncpy чудил. Совсем забыл что он нуль терминатор не вставляет.
strncpy_s вставляет.
Евгений Высочин Просветленный (38043) 3 года назад
void func(int *a)
{
static int arr[50];
for(int i = 0; i < 50; i++) arr[i] = 0;
int *ptr=arr;
ptr[0]=++*a;
printf("%d\n\n", ptr[0]);
}
kh fjkgЗнаток (328) 3 года назад
Ага.
Это static char arr[50]={0};
Почему то массив не обнуляет от функции к функции
int func()
{
static int a=0;
a++;
return a;
}
int main()
{
printf("%d\n",func());
printf("%d\n",func());
}
Евгений Высочин Просветленный (38043) kh fjkg, потому что определение вместе с объявлением работает только в первый раз: static char arr[50]= { 0 } ; Чтобы обнулялись значения, нужно каждый раз выполнять операцию присвоения значений: for(int i = 0; i < 50; i++) arr[i] = 0; Если это нужно делать и для static int a, то нужно также разделить отдельно её объявление и присвоение значений: static int a; a = 0;
Николай Веселуха Высший разум (385193) 3 года назад
Объект в функции объявляют статическим с целью сохранения результата после выхода из функции. Например, при рекурсивных вызовах функции, обнулять можно следующим образом:

#include <stdio.h>
#include <stdlib.h>
int sum(int n) {
static int s = 0;
if (!n) {
// принцип обнуления
int res = s;
s = 0;
return res;
}
s += n;
return sum(n - 1);
}
int main() {
int a = sum(10);
int b = sum(20);
int c = sum(30);
printf("a: %i\nb: %i\nc: %i\n", a, b, c);
system("pause > nul");
}
Похожие вопросы