Пошагово программа выполняется правильно, выдает ошибку Run-Time Check Failure #2 - Stack around the variable 'x' was corrupted.Что не так

введите сюда код
#include <stdio.h>
int main()
{
    int  q, w, i, i3, i7;
    long int k;
    char z[]="000000" , x[]="000", b[]="000000", v[]="000" ;
    const long int c = 10000;
    long int a[c]; int z3[100]; int z7[100];
    a[0] = 1000;
    k = 0;
    for (k = 1; k < 2000; k++)
    {
        a[k] = a[0] + 1 * k; 
        i3 = 0; q = a[k];
        do
        {
            z3[i3] = q - (q / 3) * 3;
            z[i3] = z3[i3]+'0';
            q = q / 3;
            i3++;
        } while (q != 0);
        i3 = i3 - 1;
        for (i = i3; i >= 0; i--)       
            b[i3-i] = z[i]; 
        i7 = 0; w = a[k]; 
        do
        {
            z7[i7] = w - (w / 7) * 7;
            x[i7] = z7[i7] + '0';
            w = w / 7;
            i7++;
        } while (w != 0);       
        i7 = i7 - 1;
        for (i = i7; i >= 0; i--)
        {
            v[i7 - i] = x[i];
        }
        if ((x == v) && (z == b))
            printf("\n%d", a[k]);
                
    }
}

Ответы (1 шт):

Автор решения: Harry

Что именно не так - это вы решайте сами, вы не написали, что хотите от своей программы. А вот простейшее добавление assert'ов типа

        assert(i3 >=0 && i3 < 100);
        z3[i3] = q - (q / 3) * 3;

или

    for (i = i3; i >= 0; i--)       
        assert(i3-i >=0 && i3-i < 7);
        assert(i >=0 && i < 100);
        b[i3-i] = z[i]; 

сразу показывает, что в строке

        b[i3-i] = z[i]; 

у вас i меньше нуля. Почему - разбирайтесь сами, что вы делаете в программе... Результат - выход за пределы массива, UB, испорченный стек...

И еще - абсолютно бессмысленное сравнение

    if ((x == v) && (z == b))

Это же разные массивы, значит, и адреса у них будут разные, так что это условие никогда не будет выполнено. Строки сравнивают с помощью функций типа strcmp...

→ Ссылка