C/C++

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

функция main

int main() {

int a(7), b(10), c = 100;
int z[9] = { 21,22,23,24,25,26,27,28,29 };
int* pa, * pb, * pc;

pa = &a, pb = &b, pc = &c;

int x = func(c, &b, a, z);
for (int i = 0; i < 9; i++)
cout << "z[" << i << "] = " << z[i] << endl;

printf("a = %d, b = %d, c = %d, ", a, b, c);
printf("*pa = %d, *pb = %d, *pc = %d, ", *pa, *pb, *pc);

x = func(*pa, pb, *pc, &z[1]);



return 0;
}


функция func

int func(int& a, int *b, int c, int *r) {

c += a + *b;
*b = ++a;

a = r[4] + *b;
r[2] = c++;

*(r + 4) = 450 - (--c);

*r-- = 20;
*r-- += 41; <--- вот здесь не меняется значение (строчка 16)


return c;
}
Всем привет, объясните ,пожалуйста, почему на строчке 16 в функции func (1-ый скриншот) значение массива не изменяется.
Разве не должно быть значение 1-го элемента массива 61? то есть
z[0] = 61
Происходит выход за границу массива.
В вашем примере в функцию передается указатель на начало массива z.
*r-- = 20; //тут вначале нулевому элементу присваивается значение 20, затем
указатель r оператором -- перемещается на 1 элемент массива влево (т.е. как бы на -1 индекс)
*r-- +=41; //тут r уже указывает на -1 элемент, поэтому вы изменяете участок памяти не принадлежащий массиву z. Фактически этот участок принадлежит стеку, поэтому ошибки запрета доступа обычно не возникает но может возникнуть ошибка в логике программы или ошибка стека.
Павел Мутеев
Павел Мутеев
51 417
Лучший ответ
Валера Абрамов спасибо, разобрался
Как-то так должно быть на языке С
 #include  
void modify(int* box, size_t n, int a, int* b, int* p) {
if (box != NULL && n > 0) {
size_t index = 0;
box[index] = a;
if (b != NULL && n > ++index) {
box[index] = *b;
if (n > ++index) {
*b = box[index];
}
if (n > ++index) {
int tmp = *p;
*p = *(box + index);
*(box + index) = tmp;
}
}
}
}
void show(int* box, size_t n) {
if (box == NULL) {
puts("Pointer is null");
}
else if (0 == n) {
puts("Empty array");
}
else {
size_t i = 0;
do printf("%i ", box[i]); while (++i != n);
puts("");
}
}
int main(void) {
int box[] = { 21, 22, 23, 24, 25, 26, 27, 28, 29 };
size_t n = sizeof(box) / sizeof(box[0]);
int a = 77;
int b = 88;
int c = 99;
int* p = &c;
show(box, n);
printf("a = %i\nb = %i\nc = %i\n", a, b, c);
modify(box, n, a, &b, p);
show(box, n);
printf("a = %i\nb = %i\nc = %i\n", a, b, c);
return 0;
}
P.S. В языке C нет возможности передачи параметров по ссылкам. Такой конфуз возможен только в одном случае: если вы сохранили файл исходного кода с расширением для языка C++, например, *.cpp
Сергей Зубков
Сергей Зубков
71 480
 #include  

int func(int& a, int* b, int c, int* r) {
c += a + *b;
*b = ++a;
a = r[4] + *b;
r[2] = c++;
*(r--) += 41;
*r-- = 20;

return c;
}

int main() {
int a = 7, b = 10, c = 100;
int z[9] = {21, 22, 23, 24, 25, 26, 27, 28, 29};
int* pa, * pb, * pc;

pa = &a, pb = &b, pc = &c;

int x = func(c, &b, a, z);
for (int i = 0; i < 9; i++)
std::cout
Stanislav .
Stanislav .
728
Валера Абрамов спасибо. почему то думал что на mаil.ru нет возможности так вставлять код

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