Ошибка C - все работает, но неиспользуемая переменная не может быть удалена - PullRequest
0 голосов
/ 22 марта 2019

Нет ошибок или предупреждений от отладчика, но средство очистки памяти показывает «неинициализированный доступ», по одному на каждую строку вывода.

Вывод в порядке, если я не изменю размер или не закомментирую массив, к которому я даже не получил доступ (char ArrayThatINeverEvenUsed [10000]), вывод будет неожиданным. Ошибка неинициализированного доступа появляется как в правильных / ожидаемых версиях, так и в неправильных версиях.

#include <stdio.h>

int main()
{
    FILE *fptr;
    fptr = fopen("ID_List29.csv", "wb");

    // why does this program only work if there's an UNUSED array of size ~100000 or larger 
    char ArrayThatINeverEvenUsed[10000]; // why does removing zeros cause different outputs?

    int i , j, k , m;
    int sz = 0;
    char c, d, e, f;
    char tStr[8];
    tStr[4] = 0x7C; // pipe separator
    tStr[5] = 0x7C;
    tStr[6] = 0x0D;
    tStr[7] = 0x0A;

    for(i = 65; i < 91; i++)
    {
        c = i;
        tStr[0] = c;
        for(j = 65; j <91; j++)
        {
            d = j;
            tStr[1] = j;
            for(k = 65; k <91; k++)
            {
                e = k;
                tStr[2] = k;
                for(m = 65; m <91; m++)
                {
                    f = m;
                    tStr[3] = m;
                    fprintf(fptr, "%s", &tStr[0]);
                }
            }
        }
    }
puts("Exiting...");
    return 0;
}

1 Ответ

5 голосов
/ 22 марта 2019

Null завершает ваши строки.

char tStr[9]
tStr[8]=0;

В противном случае ваш код работает случайно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...