Я пытаюсь использовать арифметику указателя для доступа к местоположениям указателей, таким как массив. Для тестирования я написал ниже код.Атрибут указателя работает, но указатель de-referencing не работает
Теперь я вижу, что арифметика указателя работает, потому что я могу видеть, что приращенный адрес указателя печатается. Но когда я удаляю ссылку на это местоположение указателя, чтобы установить некоторое значение, он не работает.
С моими знаниями о C и указателях до сих пор, я не могу объяснить, почему указатель не работает. Если бы я не смог получить увеличенное местоположение/адрес указателя, то по крайней мере я бы понял, что арифметика указателя не работает, но когда она работает, то почему указатель де-ссылки не работает.
Код:
#include<stdio.h>
#include<stdlib.h>
int **DoublePtr;
void doublePointerTest();
int main(void)
{
doublePointerTest();
}
void doublePointerTest()
{
DoublePtr = malloc(sizeof(int*));
*DoublePtr = malloc(sizeof(int) * 10);
printf("Address of DoublePtr = %p\n", DoublePtr);
printf("Address of *DoublePtr = %p\n", *DoublePtr);
**DoublePtr = 100;
*DoublePtr += 1;
printf("+1 Address of *DoublePtr = %p\n", *DoublePtr);
**DoublePtr = 1;
*(*DoublePtr += 1) = 2;
printf("+2 Address of *DoublePtr = %p\n", *DoublePtr);
//**DoublePtr = 2;
*DoublePtr += 1;
printf("+3 Address of *DoublePtr = %p\n", *DoublePtr);
**DoublePtr = 3;
// *DoublePtr[4] = 4;
// *DoublePtr[8] = 8;
// *DoublePtr[3] = 3;
// *DoublePtr[2] = 2;
for(int i = 0; i < 10; i++, *DoublePtr += 1)
{
printf("%d. ", i);
printf("%d\n", **DoublePtr);
}
}
O/P:
[email protected] (~/psets/pset5/pset5_working): clang testing.c -o testing
[email protected] (~/psets/pset5/pset5_working): ./testing
Address of DoublePtr = 0x8cd4008
Address of *DoublePtr = 0x8cd4018
+1 Address of *DoublePtr = 0x8cd401c
+2 Address of *DoublePtr = 0x8cd4020
+3 Address of *DoublePtr = 0x8cd4024
0. 3
1. 0
2. 0
3. 0
4. 0
5. 0
6. 0
7. 0
8. 135105
9. 0
[email protected] (~/psets/pset5/pset5_working):
Обновления:
Согласно комментариям и ответ, исправил мой код с DoublePtr = malloc(sizeof(int));
до DoublePtr = malloc(sizeof(int*));
и протестирован, но он дает тот же результат.
@AlterMann Тестирование, но такой же результат. – hagrawal
В отчетах printf в «Адресе» следует указать «Значение». Вы печатаете адрес указываемого объекта, а не адрес указателя. –
Записанные строки '* DoublePtr [4]' также будут переполнением буфера, вы, вероятно, имели в виду '(* DoublePtr) [4]' –