c语言编程显示内存不能为read

#include "stdafx.h"
#define N 20
int main()
{
int i,k,m,j;
int a[N];
for(i=0;i<N;i++)scanf("%d",&a[i]);
for(i=0;i<N;i++)
{i++;j++;k=j;
for(j=k;j<N;j++)
{if(a[i]=a[j])
j++;
else
printf("%d",a[i]);m=j;break;
}
if(i!=m)printf("%5d",a[i]);
}
return 0;

}

目的是将输入的数中重复的数去掉,怎么解

该提示出现在运行阶段,表示程序运行时访问了不可以访问的内存,即访问越界。
由于提示是不能read,所以是出现在读访问。一般有如下几种情况:
1 对数组访问越界。
常见于数组的循环访问,或以变量为下标导致超出数组定义范围。
对于C语言数组,定义或分配了n个元素的空间时,下标或指针移动只允许在0~n-1范围内进行,超出这个范围即为越界,会导致不可预知后果,其中一种即为内存不能read。
2 对字符串访问或输出时,字符串中没有赋值结束符\0.
C语言的字符串操作,均以\0作为结束标志。
如果字符串中没有指定结束符,那么函数会一直访问下去,导致超过字符串定义的空间范围,从而出现内存不能为read提示。
3 指针强制转换。
当目标指针类型所占用空间,超过了原本指针指向地址分配的内容时,按照新指针访问,会导致越界。
比如定义一个10字节的结构体变量,然后把地址强制赋值给一个100字节的结构体指针类型,那么通过后者去访问后90字节范围时,就属于越界操作,有可能出现内存不能read错误。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-10-30
你在第一次执行j++之前没有给j赋过初值啊。追问

有输出了,可还是不对

第2个回答  推荐于2017-12-15
#include <stdio.h>
#define N 5
int main()
{
int i;
int k = 0;
int s = N;
int a[N];
for(i=0;i<N;i++)
scanf("%d",&a[i]);
// for(i=0;i<N;i++)
// {
// for(j=k;j<N;j++)
// {
// if(a[i]=a[j])
// j++;
// else
// printf("%d",a[i]);m=j;break;
// }
// if(i!=m)printf("%5d",a[i]);
// }

for(i = 0; i < N; i++)
{
for(int j = i+1; j < N; j++)
{

k = j;
if(a[i] == a[j])
{
while(k < N -1)
{
a[k] = a[k+1];
a[k+1] = 0;
k++;
}
s--;
}
}
}

for(i = 0; i < s; i++)
{
printf("%d,",a[i]);
}
return 0;

}

可能还有些细节问题。吃饭去了 如果你发现什么问题,说下额。。。。代码还有问题。。。我回来修改下本回答被提问者和网友采纳
第3个回答  2014-10-30
#define N 5
int main(array<System::String ^> ^args)
{
int i,j;
int value[N];
int flag[N] = {0};
int value1[N];

for(i=0; i< N; i++) {
scanf("%d",&value[i] );

}
for( i = 0; i < N; i++) {
for(j=0;j<N;j++) {
if( ( value[j] == value[i] ) && ( i != j ) && flag[j]!=2 ) {
flag[i] = 1;
flag[j] = 2;
}
}
}

j = 0;
for( i = 0; i < N; i++ ) {
if ( flag[i] == 2 ) {
continue;
}
value1[j] = value[i];
j++;
}

for(i=0;i<j;i++) {
printf("%d: %d\n", i, value1[i]);
}
第4个回答  2014-10-30
我这边执行好像没出问题(结果肯定不对)

你用单步跟踪的方式看下在哪一行挂掉的
相似回答