Nano Hash - криптовалюты, майнинг, программирование

malloc() не выделяет достаточно места

Привет вот моя проблема

FILE *sourcefile;

if ((sourcefile = fopen(argv[1],"r")) == NULL)  //Opens File
{
    printf("Error: Could not open %s\n",argv[1]);
    return 0;
}

fseek(sourcefile, 0 , SEEK_END);  // Sets file pointer at the end of the file
unsigned int fSize = ftell(sourcefile); // Determines file size by the position of file pointer
fseek(sourcefile, 0 , SEEK_SET); // Sets file pointer at the start of the file

char *buffer = (char *) malloc(fSize); 

if (buffer == NULL)
{
    printf("Error: Not enough system memory\n");
    return 0;
}

printf("%d\n",sizeof(buffer));
printf("%d\n",fSile);

fread (buffer,1,fSize,sourcefile);
fclose (sourcefile);

Мой код просто открывает файл и загружает его содержимое в память. Проблема в том, что когда я использую

char *buffer = (char *) malloc(fSize)

он выделяет только 4 байта, а не полный размер файла (т.е. 25 байт при открытии простого txt с небольшим предложением). Когда я печатаю размеры buffer и fSize в конце, я получаю 4 и 25 соответственно, поэтому fSize правильно. Любая идея, почему это происходит?

Спасибо,

05.05.2014

  • Не приводить результат malloc к C. 05.05.2014
  • "%d" требует аргумента int. Используйте "%zu" для size_t (например, результат sizeof) и %u" для unsigned int. fSize должно быть типа long, так как это то, что возвращает ftell. Вы предполагаете, что ftell вернет размер файла; это верно для некоторых систем, но они не переносимы. В C нет переносимого способа определить размер файла. Пока вы пишете непереносимый код, вы также можете использовать stat() или эквивалент вашей системы. 05.05.2014
  • и открыть в бинарном режиме, а то еще менее надежно, чем было 05.05.2014
  • спасибо очень хороший совет 06.05.2014

Ответы:


1

sizeof(buffer) должно занимать 4 байта на 32-разрядной платформе. Это указатель, указывающий на буфер, выделенный malloc. Невозможно запросить размер буфера.

05.05.2014
  • Спасибо, это было довольно очевидно, иногда я действительно застреваю. 05.05.2014

  • 2

    sizeof(buffer) — это размер указателя или 32 бита (4 байта). На самом деле он выделяет достаточно места.

    05.05.2014

    3

    Возможно, это то, чего вы хотите достичь.

    #include <stdio.h>
    #include <stdlib.h>
    int  main(int argc, char *argv[])
    {
        FILE *sourcefile;
        if ((sourcefile = fopen(argv[1],"r")) == NULL)  //Opens File
        {
            printf("Error: Could not open %s\n",argv[1]);
            eturn 0;
        }
        fseek(sourcefile, 0 , SEEK_END);  // Sets file pointer at the end of the file
        unsigned long fSize = ftell(sourcefile); 
        fseek(sourcefile, 0 , SEEK_SET); // Sets file pointer at the start of the file
        fSize -= ftell(sourcefile);  /*This determines file size  */
        char *buffer = (char *) malloc(fSize); 
        if (buffer == NULL)
        {
        printf("Error: Not enough system memory\n");
        return 0;
        }
    
        printf("%ld\n",sizeof(buffer)); 
        printf("%ld\n",fSize);
        fread (buffer,1,fSize,sourcefile);
        fclose (sourcefile);
        return 1;
    }
    
    05.05.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..