Ошибка сегментации в указателях - PullRequest
2 голосов
/ 30 марта 2020

Я пытался сравнить и "массивы", и "указатели как массивы". Когда я запускаю части 1 и 2 отдельно, они выполняются нормально, но когда я запускаю весь код, я получаю ошибку сегментации.

#include<stdio.h>

int main(){
    int *p;
    int arr[5],i,var;

    //PART-1
    p=&var;
    for(i=0;i<5;i++){
        *(p+i)=i+1;
    }

    printf("\n\nPointers: ");
    for(i=0;i<5;i++){
        printf("%d ",*(p+i));
    }

    //PART-2
    for(i=0;i<5;i++){
        arr[i]=i+1;
    }

    printf("Array: ");
    for(i=0;i<5;i++){
        printf("%d ",arr[i]);
    }

    return 0;
}

Этот код работает нормально:

#include <stdio.h>

int main()
{
    int *p;
    int arr[5],i,var;

    p=&var;
    for(i=0;i<5;i++){
        *(p+i)=i+1;
    }

    printf("\n\nPointers: ");
    for(i=0;i<5;i++){
        printf("%d ",*(p+i));
    }

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Ваш код вызывает неопределенное поведение:

p=&var;
for(i=0;i<5;i++){
    *(p+i)=i+1;

Ваш указатель указывает на адрес одной целочисленной переменной. Не разрешается доступ к какой-либо памяти за пределами этого.

К тому, что находится в *(p+i), доступ запрещен. Кроме того, он не инициализируется как указатель, а разыменование - еще один источник неопределенного поведения. Оба обращения могут привести к вашей ошибке сегментации.

Как и для всех UB, он может сразу же создать sh или нет. Вот почему обе части рушатся, в то время как они кажутся работающими по отдельности.

0 голосов
/ 30 марта 2020

Из вашего кода

  int arr[5],i,var;

var не является массивом, поэтому этот код обращается к неинициализированной памяти, он не определен. Поведение

p=&var;
for(i=0;i<5;i++){
    *(p+i)=i+1;
}

printf("\n\nPointers: ");
for(i=0;i<5;i++){
    printf("%d ",*(p+i));
}

Поэтому измените определение var на var[5]

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