案例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;
}
代码应给出细分错误。
答案 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不会对内存进行此类验证-它会按照说明进行读取/写入。