所以,我有一个赋值,要求我比较2个整数数组(a [5]和b [8])并使用指针检查重复的元素。 到目前为止,这是我提出的代码:
int main(void) {
int *pa, i, j, sizeA=5, sizeB=8, a[sizeA], b[sizeB], aux[sizeB];
for (i=0; i<sizeA; i++){
scanf("%d", &a[i]);
}
for (i=0; i<sizeB; i++){
scanf("%d", &b[i]);
}
for (i=0; i<sizeB; i++){
aux[i] = NULL;
}
for(i=0;i<sizeA; i++){
for(j=0; j<sizeB; j++){
if ((a[i] == b[j]))
aux[i] = b[j];
}
}
for(i=0;i<sizeA; i++){
pa = &aux[i];
if ((pa != NULL)&&(*pa!=aux[i+1])){
printf("%d \n", *pa);
}
}
return (EXIT_SUCCESS);
}
编译并运行没有错误,但是当没有重复元素时,Loop的最后一个元素会输出奇怪的值,如435304。
我试图让指针“pa”扫描数组“aux”,并且只打印与数组上下一个元素不同的元素,并检查指针指向的位置是否为空。
任何提示?
编辑:我解决了用NULL值初始化aux数组的问题。它算作有效的解决方案吗?有没有更好的方法呢?
EDIT2:感谢所有帮助过我的人。祝你有愉快的一天。
答案 0 :(得分:1)
您的问题是aux
是堆栈符号。取其偏移&aux[i]
的地址将始终返回非NULL
,因为它位于堆栈上。您正在获取预定义数组元素的地址。
如果您打算在aux
中保存指针,则需要将其定义为int *
int * aux[sizeB];
memset(aux, 0, sizeof(aux)); // don't forget to initialise it
当你指定它时,你在那里分配地址。
for(i=0;i<sizeA; i++){
for(j=0; j<sizeB; j++){
if ((a[i] == b[j]))
aux[i] = &b[j];
}
}
在循环中只需阅读地址:
for(i=0;i<sizeA; i++){
pa = aux[i];
if ((pa != NULL)&&(*pa!=*(aux[i+1]))){
printf("%d \n", *pa);
}
}
答案 1 :(得分:1)
你只在aux
上写出相同的内容,这意味着aux
的内容将是B内容的一个子集,但你用sizeB
大小< strong>而不是初始化它的内容。这意味着在创建时,aux
的内容都是内存垃圾。因为,通过子集定义,您将保留aux
的位置而不写入(除非A = B),未写入的位置保持不成文,因此最终包含gargabe。初始化它以避免问题:
int myArray[10] = { -1 }; //all elements to -1
在找到-1
或其他任何您想用来标记空位的值时停止迭代。
答案 2 :(得分:0)
你应该正确地启动aux(c默认情况下不会用零填充数组,这是你的奇怪值来自的地方)并添加一个计数器来计算你找到的匹配数而不是使用i < sizeA
最后一个循环。
答案 3 :(得分:0)
由于您要将数据从b
复制到aux
。
if ((a[i] == b[j]))
声明如果确实如此,则复制数据。那么告诉我们您的意见是什么?
由于您没有在两个阵列中获取公共数据。它正在打印垃圾值。
解决方案:
只需在两个阵列中提供相同的数据,您就可以获得输出。
答案 4 :(得分:0)
aux具有默认值
首先将aux的所有值设置为0或运行计数器直到aux已填充的位置