Информация об изменениях

Сообщение Re: Запись указателя в массив указателей от 24.04.2023 17:10

Изменено 24.04.2023 17:11 T4r4sB

Re: Запись указателя в массив указателей
Здравствуйте, wbear, Вы писали:
*((DWORD*)pNewMem+v3-1) = pS;//????? )

Выражение внутри скобок имеет тип DWORD*
значит разыменованное выражение имеет тип DWORD
А pS, судя по всему, имеет типа DWORD*
И ещё у тебя везде путаются указатели на строки и указатели на указатели на строки

Попробуй так:
*((DWORD**)pNewMem+v3-1) = pS;

А вообще у тебя походу DWORD используется для хранения указателя, это плохо, ты используешь не тот тип, к тому же их размеры совпадают не везде

Если хоть как-то убрать всю путаницу, то будет примерно так (набирал в браузере):
  Скрытый текст
   int len=1;
    char** pMemory;

    pMemory = (char**)calloc(sizeof(char*), len);

    pS = (char*)CloneString("d://Work//CxFViewer//CxFViewer//4//data//cbf//AAG169.cbf");

    if(pS)
    {

        printf("%s\n", pS);
        ++len;
        char** pNewMem = (char**)realloc(pMemory, len * sizeof(char*));           

        if(!pNewMem)
        {
            free(pMemory);
            return 0;
        }

        pMemory = pNewMem;
        pNewMem[len] = pS;
    }



А лучше такие вещи делать на С++. А если приходится постоянно дёргать динамическую память на сишке — это значит, ты либо что-то делаешь не так (например, нельзя ли заранее выделить блоки нужного типа и размера для начала работы алгоритма), либо выбрал не тот язык для задачи.
Re: Запись указателя в массив указателей
Здравствуйте, wbear, Вы писали:
*((DWORD*)pNewMem+v3-1) = pS;//????? )

Выражение внутри скобок имеет тип DWORD*
значит разыменованное выражение имеет тип DWORD
А pS, судя по всему, имеет типа DWORD*
И ещё у тебя везде путаются указатели на строки и указатели на указатели на строки

Попробуй так:
*((DWORD**)pNewMem+v3-1) = pS;

А лучше

pNewMem[v3-1] = pS;



А вообще у тебя походу DWORD используется для хранения указателя, это плохо, ты используешь не тот тип, к тому же их размеры совпадают не везде

Если хоть как-то убрать всю путаницу, то будет примерно так (набирал в браузере):
  Скрытый текст
   int len=1;
    char** pMemory;

    pMemory = (char**)calloc(sizeof(char*), len);

    pS = (char*)CloneString("d://Work//CxFViewer//CxFViewer//4//data//cbf//AAG169.cbf");

    if(pS)
    {

        printf("%s\n", pS);
        ++len;
        char** pNewMem = (char**)realloc(pMemory, len * sizeof(char*));           

        if(!pNewMem)
        {
            free(pMemory);
            return 0;
        }

        pMemory = pNewMem;
        pNewMem[len] = pS;
    }



А лучше такие вещи делать на С++. А если приходится постоянно дёргать динамическую память на сишке — это значит, ты либо что-то делаешь не так (например, нельзя ли заранее выделить блоки нужного типа и размера для начала работы алгоритма), либо выбрал не тот язык для задачи.