为什么代码没有给出细分错误?

时间:2019-08-01 13:37:25

标签: c

  • 案例1此处用于插入数组'a'。但是在插入时,增加n显然会导致数组大小增加,因为它继续接受超出初始数组大小声明的输入。例如n=1

  • 案例2用于删除。

  • 案例3用于显示。

此代码甚至如何工作?

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i,*a,n,j=0,k;
    scanf("%d",&n);
    a = (int *)malloc(n*sizeof(int));
    while(1)
    {
        scanf("%d",&i);
        switch(i)
        {
            case 1:
                scanf("%d",&a[j]);
                j+=1;
                n=n+1;
                break;
            case 2:
                scanf("%d",&k);
                for(i=k-1;i<n;++i)
                    a[i]=a[i+1];
                    n=n-1;
                    break;
            case 3:
                for(i=0;i<n-1;++i)
                    printf("%d\t",a[i]);
                break;
            case 4:
                exit(1);
        }
    }
    return 0;
}

代码应给出细分错误。

1 个答案:

答案 0 :(得分:-3)

因为我们在学校所教的内容并不完全正确;

int *i = new int; 
*i = 10;   // OK
delete i;
*i = 12;   // OH NO!!!

我已经解释过,对悬空指针的第二次分配将使应用程序崩溃。现实-堆仍分配给应用程序,并且仍然可以访问该内存区域。

int *j, *i;
i = new int; 
delete i;
j = new int;
*i = 10;   // FAIL? - now j *might* be 10

在第二个示例中,内存分配器将先前由i分配给j的地址。因此,偶然地,它们都指向RAM中的同一位置。 (我承认,这在现实生活中极有可能不会发生,但“有可能”发生。)

但是-在您的示例中,您正在堆栈中分配变量。在现代系统中,这相当大,因此您可以继续“触摸”内存,而不会出现任何问题,因为它仍然对您的进程有效;

void foo() {
    int i[10];
    int j;

    i[11] = 12;
    // now j == 12
    i[12] = 13;
    // now another memory location is 13, still OK.
}

通过valgrind运行摘要,它将抱怨。但是,CPU不会对内存进行此类验证-它会按照说明进行读取/写入。