Двойной указатель, указывающий на случайный адрес той же области кучи
У меня есть статический массив символов в 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
}