Двойной указатель, указывающий на случайный адрес той же области кучи

У меня есть статический массив символов в func1(). И когда я вызываю func2(), я передаю ему адрес массива char (двойной указатель), потому что я выделяю память внутри него. Затем, выполнив некоторые вычисления с указателем и при втором вызове функции, указатель не сбрасывается, но он указывает где-то в диапазоне моих выделенных байтов.

Допустим, я выделил 500 байт. Первый звонок начинается с 0, а второй просто продолжается.

Давайте возьмем теперь другой подход в качестве примера, выделяя память в func1 () и не нуждаясь в двойном указателе с тем же кодом, всякий раз, когда вызывается func2(), указатель сбрасывается и начинается с 0.

Почему я испытываю это?

ДЕЛО 2

func2(char *array){   

 ++array; // position 1
}

func1(){
    static char *array;

    if(array == NULL){
    array = (char*) malloc(500 * sizeof(char));
    }

    func2(array);
    func2(array); // again position 1


}

СЛУЧАЙ 1

func2(char **array){
    if(*array == NULL){
    *array = (char*) malloc(500 * sizeof(char));
    }

    ++*array; // position 1
}

func1(){
    static char *array;

    func2(&array);
    func2(&array); // calling it again, pointer goes on position 2
    // or it starts counting for ex. from position 55(random said)

}

1 ответ

Я передал массив, как в случае 2, он был скопирован, и я изменил некоторые значения, при другом вызове значения присутствовали, но указатель всегда начинался с начала? Не могли бы вы объяснить мне это...

В случае звонка func2(array)передается не копия выделенного объекта массива, а только копия значения указателя arrayконечно указав на тот же адрес памяти; таким образом, когда func2() изменились некоторые значения элементов объекта массива, эти измененные значения естественно присутствуют при другом вызове с тем же адресом объекта, тогда как когда func2() изменил свою локальную копию array посредством ++arrayэто не влияет на func1()локальный указатель с именем array,

… Но единственный способ для случая 1 вести себя одинаково - всегда сохранять начальную позицию, чтобы я мог уменьшить указатель?

Если вы хотите, чтобы объект массива был размещен в func2(char **)как в случае 1, но array указатель не может быть изменен func2()Вы могли бы написать:

void func2(char **arrayaddress)
{
    if (*arrayaddress == NULL) *arrayaddress = malloc(500);
    char *array = *arrayaddress;    // make own local copy, keep *arrayaddress unchanged
    ++array;    // position 1
}

void func1()
{
    static char *array;
    func2(&array);
    func2(&array);  // calling it again, pointer unchanged
}
Другие вопросы по тегам