首页 > 解决方案 > 指针中的分段错误

问题描述

我试图比较“数组”和“指针作为数组”。当我分别运行 part1 和 part2 时,它们执行得很好,但是当我运行整个代码时,我得到了分段错误。

#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;
}

标签: cpointers

解决方案


您的代码调用未定义的行为:

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

您的指针指向单个整数变量的地址。不允许访问除此之外的任何内存。

*(p+i)不允许访问任何碰巧位于的位置。此外,它没有被初始化为指针并且取消引用它是未定义行为的另一个来源。这两种访问都可能导致您的分段错误。

与所有 UB 一样,它可能会立即崩溃,也可能不会。这就是为什么 runnign 两个部分在看似单独工作时会崩溃。


推荐阅读