检查指针是否指向int数组上的空白空间

时间:2013-08-19 13:24:46

标签: c arrays pointers

所以,我有一个赋值,要求我比较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:感谢所有帮助过我的人。祝你有愉快的一天。

5 个答案:

答案 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已填充的位置