2013-10-25 2 views
1

Я новый студент в программировании на языке C. Я сделал небольшую программу, чтобы увидеть в действии все комбинации ++ в указателях. Так что я codded: (я запустить его в Ubuntu с помощью VirtualBox)постепенно увеличивайте адрес указателя

#include <stdio.h> 

main() 
{ 
    int num = 1; 
    int *p = &num; 

    printf("\nnum position: %p num value: %d\n", p, num); 

    *p += 1; 
    printf("\n---- *p += 1; -----\n"); 
    printf("num position: %p num value: %d\n", p, num); 

    *p++; 
    printf("\n---- *p++; -----\n"); 
    printf("num position: %p num value: %d\n", p, num); 

    (*p)++; 
    printf("\n---- (*p)++; -----\n"); 
    printf("num position: %p num value: %d\n", p, num); 

    ++(*p); 
    printf("\n---- ++(*p); -----\n"); 
    printf("num position: %p num value: %d\n", p, num); 

    ++*p; 
    printf("\n---- ++*p; -----\n"); 
    printf("num position: %p num value: %d\n\n", p, num); 

} 

Выход:

num position: 0xbfce07b8 num value: 1 

---- *p += 1; ----- 
num position: 0xbfce07b8 num value: 2 

---- *p++; ----- 
num position: 0xbfce07bc num value: 2 

---- (*p)++; ----- 
num position: 0xbfce07bd num value: 2 

---- ++(*p); ----- 
num position: 0xbfce08bd num value: 2 

---- ++*p; ----- 
num position: 0xbfce08bd num value: 2 

я понял другое использование ++. Однако мой вопрос об адресах (я просто пишу 4 цифры)

Сначала адрес: 07b8
после 1-го прироста адрес является 07bc (увеличение на 4 (HEX))
после 2-го приращения адрес является 07bd (увеличивается на 1 (HEX))
после приращения 3-я адрес 08bd (увеличен на 100 (гекса))

Почему приращение адреса не является стабильным?

+0

Не забудьте добавить return 0; в конце вашего основного. всегда используйте return 0, а также пытайтесь использовать int main(), а не просто main(), поскольку c99 строго проверяет типы возврата – niko

ответ

1

Ваша программа имеет неопределенное поведение: ваш код не может писать в *p после того, как он был расширен, потому что в этот момент указатель указывает на память, не выделенную int. Из-за того, как объявляются ваши переменные, кажется, что после первого приращения указатель фактически указывает на себя! Распечатка адреса указателя &p должна подтвердить это.

Чтобы устранить эту проблему, измените свою программу следующим образом:

int data[] = {0,0,0,0,0,0,0,0,0,0}; 
int *p = data; 

Теперь вы можете увеличивать указатель до десяти раз без риска записи в память за пределами диапазона, выделенный для вашей программы.

Примечание: %p ожидает указатель void*, поэтому вы должны вставить явное выражение.

+0

. Я забыл, что% p требуется (void *) & p. Я изменил это, и результат имеет больше смысла теперь '0xbfabdf98' ->' 0xbfabdf9c' -> '0xbfabdf9d'. Также 'int p = #' @dasblinkenlight – yaylitzis

+0

@ Nat95 Ему нужно '(void *) p'. Когда вы передаете '(void *) & p', вы печатаете адрес самого указателя, который должен оставаться постоянным во всей программе. Я предложил напечатать '(void *) & p', чтобы увидеть, что он получает выделение вскоре после' num': после 'p ++' указатель будет указывать на себя. – dasblinkenlight

-1

Это происходит потому, что в целом память не выделяется последовательно O.S. В начале вы можете прочитать больше here.

Смежные вопросы