C memcpy ошибка - не удалось записать память на Windows XP - PullRequest
0 голосов
/ 23 августа 2010

У меня есть программа на C, которая загружает файл построчно в одну строку, а затем memcpy в эту строку в другой строковый указатель, используя этот код:

   typedef struct inmod_struct {
       Int32 ReturnCode;
       Int32 Length;
       char  Body[ROWSIZE];
    } inmdtyp,*inmdptr;

    inmdptr inmodptr;
    char line[600];
    int doit()
    {
        char *p;
        p = inmodptr->Body;
        ReadFile();  //reads a line of the file into **line** string variable


    memcpy(p, line, strlen(line));
    p += strlen(line);

    inmodptr->ReturnCode = 0;
    inmodptr->Length = p - inmodptr->Body;

    reccnt++;
}

Но когда я выполняю вышеуказанную программу наНа моем компьютере с Windows XP SP3 я получаю сообщение об ошибке:

Инструкция в ""ссылка на память"". Память не может быть" записана ". Нажмите OK, чтобы завершить ....

Я столкнулся с подобной проблемой, когда пытался выполнить аналогичные операции с памятью, это вызывает похожие проблемы. Strcpy лучше всего работает длямне, но strcpy пропускает чтение до NUL символа в строке, но у меня будет еще несколько символов для чтения, даже после NUL в строке. Кто-нибудь может пожалуйста предоставить обходной путь или любую подсказку для этого.

Среда: Windows XPSP3, компилятор GCC.

Я даже пытался подобным образом компилировать и использовать код на Solaris Unix, и я столкнулся с той же проблемой там.Примеры также.

Редактировать: Извините, ребята .. У меня есть инициализированный указатель p p = inmodptr->Body; inmodptr является структурой. И я могу подтвердить, что инициализация указателя не является проблемой.полный код для наглядности

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Вы должны выделить буфер и иметь p для хранения адреса этого буфера. Тогда вы можете использовать p, как вы сделали.

Указатель - это переменная, которая содержит адрес памяти. Ваш указатель содержит неинициализированное значение, которое, вероятно, не указывает на действительный адрес памяти.

char *p = malloc(strlen(line) + 1);

Если вы храните строку, дополнительная +1 предназначена для завершенного NULL символа \0. Если по какой-то причине вы используете memcpy вместо strcpy, вам придется вручную NULL завершать ваш буфер.

Также, если вы malloc, обязательно наберите free, как только вы закончите с ним. Вы также можете просто разместить массив символов и использовать его вместо p.

0 голосов
/ 23 августа 2010

Эта строка:

inmdptr inmodptr;

объявляет указатель inmodptr, но не инициализирует его - он указывает на какое-то случайное место в памяти.

Вам нужно указать где-нибудькоторый может содержать фактический экземпляр объекта struct inmod_struct - например:

inmdtyp inmod;
inmdptr inmodptr = &inmod;
...