Адреса указателей перезаписываются - PullRequest
0 голосов
/ 11 июля 2020
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

using namespace std;
int d;
long long int *arr = (long long int*)malloc(d * sizeof(long long int));
    
int* func(){
    int *p = (int*)malloc(sizeof(int));
    *p =5;
    return p;
}

int main(){
    int *p = NULL;
    p = func();
    d =10;
    printf("add of p: %d\n\n",p);
    
    int i=0;
    for(;i<10;i++){
        printf("Add of arr: %d \n",arr+i);
    }
    
    
    return 0;   
}

Адрес, присвоенный указателю 'p', перезаписывается адресом некоторого местоположения массива 'arr'. Почему это происходит? даже когда 'mallo c' назначает память в куче.

Также, если я использую один и тот же тип данных для 'p' и 'arr', то такой проблемы не возникает.

Вывод кода :

введите описание изображения здесь

Ответы [ 3 ]

3 голосов
/ 11 июля 2020

Вы явно думаете, что вы выделили массив размером 10. Однако, когда это выражение выполняется,

long long int *arr = (long long int*)malloc(d * sizeof(long long int));

d имеет нулевое значение. d - глобальная переменная, поэтому по умолчанию инициализируется нулем. Как ни странно, есть еще одна переменная с именем d в main, но это не имеет никакого отношения к распределению arr.

1 голос
/ 11 июля 2020

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

0 голосов
/ 11 июля 2020

Это просто Undefined Behaviour. Есть некоторые проблемы, связанные с памятью (например, доступ к массиву за пределами ...), когда C / C ++ просто говорит, что должно произойти, если все правильно доступно, а все остальное остается неопределенным. Так что это может когда-нибудь сработать, а может и нет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...