分类：电脑/网络-软件
问题：这段程序在tc上无错误在vc++6.0就显示内存不能read大家 
大家帮忙看看吧#include<std.h>sort(int **p,int n){  int *t,i,j;  for(i=0;i<n-1;i++)  {    for(j=i+1;j<n;j++)    {      if(**(p+i)>**(p+j))      {        t=*(p+i);        *(p+i)=*(p+j);        *(p+j)=t;      }    }  }}main(){  in大家帮忙看看吧#include<std.h>sort(int **p,int n){  int *t,i,j;  for(i=0;i<n-1;i++)  {    for(j=i+1;j<n;j++)    {      if(**(p+i)>**(p+j))      {        t=*(p+i);        *(p+i)=*(p+j);        *(p+j)=t;      }    }  }}main(){  int i,n,**p;  printf("Please input count of numbers:");  scanf("%d",&n);  for(i=0;i<n;i++)  {    printf("The %d number:",i+1);    scanf("%d",*(p+i));  }  printf("\nThe result is :\n");  sort(p,n);  for(i=0;i<n;i++)  {    printf("%d ",**(p+i));  }  getch();}
回答：TC2.0是DOS程序，在dos程序眼里是没有内存保护，真的dos下，是没有内存保护的。
windows的dos模式下是windows欺骗dos模式的程序：你可以不受限制的使用整个内存空间。其实这个空间是一个假的连续的内存空间，他好象可以访问整个内存空间，其实不能访问别的程序的内存空间，这个连续的空间是这个进程独有的。其实是整个系统的地址空间的一个小部分。只是进行了地址的重新映射



你的scanf("%d",*(p+i))
中*(p+i)指向的地址并没有进行分配，在有内存保护的时候是不能读也不能写的

你的p ,p+i等指针都是指向不明地址空间的野指针，这些内存空间很可能是被保护的。
dos模式下，没有内存保护，不报错，野指针指到哪就写到哪，当然可能破坏有用的内存空间中的数据，也可能正好指向空的内存空间程序能正常运行。