2015-07-09 2 views
0

В моей визуальной студии, этот кодуказателя без выделения памяти назначения

int *a, *b; 
b = a; 
a = (int *)malloc(SIZE * sizeof(int)); 

Получит во время выполнения проверки сбоя: переменные используются без инициализации. Итак, если указатель не выделен, тогда назначение является бессмысленным и запрещенным? По моему старому мнению, указатель представляет собой 4 байта в моей среде разработки для описания адреса. Таким образом, в воображении, то это:

int *a, *b; 
b = a; 
a = (int *)malloc(SIZE * sizeof(int)); 
*a = 10; 
printf("%d", *b); 

Тогда * Ь = 10; Но, видимо, это не так ... Так что я смущен, почему указатель a и b не указывает на одну и ту же память ниже? Может кто-нибудь объяснить это мне?

+0

Почему это работает? http://coliru.stacked-crooked.com/a/4b5c33f1d65e47aa – VermillionAzure

+0

@VermillionAzure Неопределенное поведение. – Barry

+0

@VermillionAzure В моей визуальной студии ... Я описал свою среду ... И еще в вашем коде кажется, что на самом деле ваш указатель не выделяет память. Он используется как Integer ... – lirui

ответ

1

Как вы уже видели пример из МакНабба @ Matt это

int*a, *b; 
b = a; 

не означает, что где-либо «a» указывает, всегда будет указывать на это местоположение после этого назначения. Это будет делать только первое задание ie.

int *a, *b; 
int k = 10; 
int m = 20; 
a = &k; 
b = a; // this will point b to k 
a = &m; // this will change a to point to m however b will remains pointing to k 

Кроме того, обратите внимание, как сказал @Barry, вы во-первых, есть неинициализированный указатель, а затем присвоить б, чтобы указать на то место, где что неинициализированным указатель, указывающий на < < это действительно плохая привычка программирования, как вы будете никогда не знаете, где именно указывал (я не уверен, зависит ли это от машины и компилятора или нет). Это может вызвать у вас большой беспорядок.

4

Это плохо:

int *a, *b; 
b = a; 

по той же причине, что это плохо:

int a, b; 
b = a; 

Вы читаете неинициализированный переменную. a имеет неопределенное значение. Это на самом деле не должны указывать на выделенную память, это было бы хорошо:

int* a = 0; 
int* b = a; // OK, a was initialized 
0

Для детального объяснения,

таНоса() выделяет байты размера и возвращает указатель на выделенную память. Таким образом, указатель получит новый адрес памяти, назначенный после успешного malloc, из-за которого после адреса вызова malloc значения & b отличается тем, что при де-ссылке дает разные значения.

Если вы видите вывод программы ниже, вы получите ответ.

#include<stdio.h> 
#include<stdlib.h> 
#define SIZE 1 
main() 
{ 
    int *a, *b; 
    b = a; 
    printf("Address of a:%p\n", a); 
    printf("Address of b%p\n", b); 
    a = (int *)malloc(SIZE * sizeof(int)); 
    printf("Address of a:%p\n", a); 
    printf("Address of b%p\n", b); 
    b = a; //assigning address of a to b 
    *a = 10; 
    printf("%d\n", *b); 
} 

Выход:

Address of a: 0x7fff2f2813c0 
Address of b: 0x7fff2f2813c0 

После выделения памяти для указателя 'а',

Address of a: 0x1829010 
Address of b: 0x7fff2f2813c0 
10 
Смежные вопросы