Работа с указателями. ПОчему не работает: *(char *)Temp = 32

Тема в разделе "LANGS.C", создана пользователем serega28, 7 июн 2008.

  1. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Есть вот такой кусок кода:

    void Function(LPVOID Buffer)
    {
    LPVOID Temp;

    Temp=Buffer;



    *(char *)Temp = 32; --Вот тут я не понимаю. Почему Access violation
    }

    Может есть другой вариант как это реализовать???
     
  2. SharipovNail

    SharipovNail Наиль

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    7
    Адрес:
    Москва
    посмотрите с помощью Debug'a значение Buffer (или Temp). Может в функцию просто передается некорректное значение Buffer, типа 0x00000000. Ну и для большей читабельности можно записывать так *((char*)Temp). Хотя проблема конечно в неправильном адресе
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    assert(Buffer != NULL);
     
  4. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Адрес нормальный. И данные там есть.
     
  5. SharipovNail

    SharipovNail Наиль

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    7
    Адрес:
    Москва
    Access violation - в конечном счете идет обращение по неправильному адресу. Откуда берется значение для Buffer перед вызовом функции? может быть это адрес на область памяти, которая не зарезервирована (статически или динамически) для Вашей программы. Buffer должен указывать либо на объявленные переменные, либо на область выделенную динамически (например, malloc или что там используется под Виндой).
     
  6. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Function("proverka") -вот и вся переменная
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    давай код вызова этой функции
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    "proverka" попадает в R/O область памяти?
     
  9. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    censored, да адназначна у секции рид онли .)
     
  10. SharipovNail

    SharipovNail Наиль

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    7
    Адрес:
    Москва
    да, кстати, это возможно... в такой форме "proverka" может быть строковой константой, которую нельзя изменять.
     
  11. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Вот код.

    void function(LPVOID Buffer)
    {
    LPVOID Temp;
    Temp=Buffer;

    *(char *)Temp = 32;
    }
    int APIENTRY _tWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow)
    {
    Function ("Proverka");
    return 0;
    }
     
  12. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    "Proverka" – это константа. Делайте:
    Код (Text):
    1. char proverka[] = "Proverka";
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Строки в кавычках размещаются в секции, доступной только на чтение. Либо меняй параметры линкера, чтобы секция была доступна на запись или совмещалась с доступной на запись секцией, либо выделяй в куче/на стеке.
     
  14. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Ну если на то пошло, то от

    Код (Text):
    1. assert(!IsBadWritePtr(Buffer, 1));
    проку больше