присвоение значения индексу массива возвращает SIGSEGV; ошибка сегментации. | c

Я получаю ошибку сегментации в строке 28 приведенного ниже кода. Примечание: программа не завершена.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{  
    // get data
    FILE* raw = fopen("card.raw", "r");
    int rawLength = 0;
    while(fgetc(raw) != EOF){
        rawLength++;
    }

    char dat[rawLength + 1];
    fread(dat, 1, rawLength + 1, raw);

    // separate data into blocks
    int data[sizeof(dat) / 512][512];

    data[0][0] = atoi(*dat[0]); // <----------- this is line 28 where the error is happening.

    for(int i = 0; i < sizeof(data) / 4; i += 512)
    {
        for(int j = 0; j < 512; j++)
        {
            data[i][j] = atoi(*dat[i + j]);
        }
    }
}

Этот код должен открыть необработанный файл с именем «card.raw» и прочитать его содержимое и размер. Затем он проверяет наличие jpeg внутри файла, используя официальный заголовок jpeg: «0xff 0xd8 0xff [что-то от 0xe0 до 0xef]».

На данный момент это все, что он делает, но когда я закончу с ним, он должен сохранить каждый найденный jpeg в новом файле. По сути, это система восстановления jpeg, поскольку папка для мусора ваших устройств похожа на нее. Все, о чем я прошу, это выяснить ошибку; вам не нужно писать целую программу восстановления, если вы не можете прямо сейчас. спасибо за помощь! :)

Почему бы тебе не попробовать его отладить? Если вы не можете использовать отладчик, добавьте распечатки. Например, проверьте / распечатайте значение rawLength, длину dat после того, как вы прочитали его из raw файла. Я предполагаю, что dat не '\0' прекращено, но вы можете понять это без помощи Stackoverflow.   —  person person the human    schedule 23.05.2020

Неясно, подходит ли содержимое файла для atoi; в любом случае он не должен вылетать, если dat не завершается нулевым символом. Добавьте memset (dat, 0, sizeof (dat)); сразу после объявления char dat[rawLength + 1];. В худшем случае массив будет содержать 0 в последней позиции.   —  person person the human    schedule 23.05.2020

См. также:  есть ли проблема в моем коде и как ее исправить?

fread ничего не читает. После fgetcreturn EOF это конец файла — больше нечего fread. Какое значение имеет rawLength? Кроме того, я не верю, что вы понимаете, что делает atoi. Чего вы ждете на выходе? Хранит ли файл строку с нулевым завершением?   —  person person the human    schedule 23.05.2020

спасибо @KamilCuk за подсказку, но у меня все еще та же проблема на той же строке.   —  person person the human    schedule 23.05.2020

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. person the human

    Насколько я понимаю, atoi преобразует строку char * в целое число. Поэтому я думаю, что символы вне «0-9» не будут работать. Я проверю шестнадцатеричный и двоичный код позже.

    что вы подразумеваете под символами вне «0-9»? person person the human; 24.05.2020

    действительно сожалею о путанице. я хотел сделать атой (* …), а не атой (& …). Я только что исправил это в редактировании. person person the human; 25.05.2020

    то, что я пытаюсь сказать, это 1 и ‘1’, разные, поэтому при использовании atoi () для преобразования он ожидал бы строку, состоящую из символов 0-9, а не int 0-9, если 1-й символ вашего файла был 0xff, тогда он возвращает число, но 0xff — это ascii [0xff]. person person the human; 25.05.2020

    Ok. Спасибо за объяснение. Я изменил data[i][j] = atoi(*dat[i + j]); на data[i][j] = atoi(*((string)dat[i + j]));, но он по-прежнему не работает [: ‹]. person person the human; 27.05.2020

    Для чтения данных из файла используйте обычный fread (..). Если вы уверены, что это строка чисел, используйте atoi. тогда подпись jpeg, которую я видел, была шестнадцатеричной, а не шестнадцатеричной. person person the human; 30.05.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: