Потерять значение указателя массива? - PullRequest
3 голосов
/ 30 сентября 2019

Я создаю функцию для чтения чисел из файла в массив. Но похоже, что после возврата из функции последнее значение теряется. Вот мой код:

void loadDataset(int* dataSet, int DataSetSize, char *filename) {
    FILE *fp;
    fp = fopen( filename , "r" );

    for(int i=0; i< DataSetSize; i++){
        fscanf(fp, "%d", &dataSet[sizeof(int) * i]);
    }

    for (int i = 0; i < DataSetSize; i++) {
        printf("%d\n", dataSet[sizeof(int) * i]);
    }

    fclose(fp);
}

int main(int argc, char *argv[]) {
    ...
    int* ds = malloc(sizeof(int) * DataSetSize);
    loadDataset(ds, DataSetSize, DatasetFilename);

    for (int i = 0; i < DataSetSize; i++) {
        printf("%d\n", ds[sizeof(int) * i]);
    }
    ...
}

Файл, с которым я тестирую, содержит числа от 1 до 6. В функции loadDataset результат печати равен

1
2
3
4
5
6

Но при возвратев функции main выводится результат:

1
2
3
4
5
0

В чем может быть проблема?
Извините, если это что-то тривиальное, я пропускаю, но я не очень знаком с программированием на C.

1 Ответ

5 голосов
/ 30 сентября 2019

Это выражение

fscanf(fp, "%d", &dataSet[sizeof(int) * i]);
                          ^^^^^^^^^^^^^^^      

не имеет смысла. В результате использования такого выражения программа имеет неопределенное поведение, поскольку предпринимаются попытки получить доступ к памяти вне выделенного массива.

Использовать вместо

fscanf(fp, "%d", &dataSet[i]);

или

fscanf(fp, "%d", dataSet + i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...