我的代码有效,给了我正确的输出,但是我也得到了额外的数字

时间:2019-02-17 22:37:37

标签: arrays pointers c89

我制作了一个程序,该程序将使用两个数组,并将其放入一个函数中,该函数将比较两个数组的元素,并创建一个包含前两个元素的所有唯一元素的新数组。我的代码不带编译错误,并且当我运行代码时,我得到了正确的输出,但是在此之后,我在所有大小上得到了一堆额外的随机数。我不确定这是某种细分错误,还是其他原因。但是我不确定这个问题与什么有关,以及在哪里寻找解决方案。

#include <stdio.h>

void find_elements(int *a, int n1, int *b, int n2, int *c, int *size);

int main(){

int n1, n2;
int a[n1];
int b[n2];
int i;
int size=0;

printf("Enter the length of the first array: ");
scanf("%d", &n1);


printf("Enter the elements of the first array: ");
for(i=0; i<n1; i++)
scanf("%d", &a[i]);

printf("Enter the length of the second array: ");
scanf("%d", &n2);


printf("enter the elements of the second array: ");
for(i=0; i<n2; i++)
scanf("%d", &b[i]);

size = n1+n2;
int c[size];

  find_elements(a, n1, b, n2, c, &size);
printf("Output: ");
for(i=0; i<(size); i++)
printf("%d ", c[i]);


return 0;   

}

void find_elements(int *a, int n1, int *b, int n2, int *c, int *size){

int *p;
int *p1;
int i, j;
int count;

p=a;

for(i=0; i<n1; i++){
    p1 = b;
    for(j=0; j<n2; j++){
        if(*p==*p1){
            break;}
        p1++;
            }
    if(j==n2){
        *c=*p;
        c++;
        count++;
        }
    p++;

}

p=b;

for(i=0; i<n2; i++){
    p1 = a;
    for(j=0; j<n1; j++){
            if(*p==*p1){
            break;}
        p1++;
            }
    if(j==n1){
        *c=*p;
        c++;
        count++;
        }
    p++;
    *size = count;

} }

我的代码的输入/输出示例:

输入第一个数组的长度:5

输入数组的元素:9 8 5 6 4

输入第二个数组的长度:4

输入数组的元素:6 9 7 1

输出:8 5 4 7 1

我得到了这个输出,但是除此之外我得到了:

输出:8 5 4 7 1 0 -1 0 0 0 740434312 60 0 0 4196006 0 6 7 9 1 9 8 5 6 4 0 4196528 65 4 5 -1 -1 1000611008 32764 -1 -1 1000610992 32764 8 0 1000610928 32764 4195408 43 0 0 4195408 0 0 0 746712

1 个答案:

答案 0 :(得分:0)

代码的问题之一是顺序:

int n1, n2;
int a[n1];
int b[n2];

在程序开始时,未知的数组ab分配了未初始化的值,即n1n2

另一个问题是int count;中的find_elements也未初始化。因此,输出参数size的返回值是不确定的。

main的内存更安全(不安全)版本可能看起来像:

int main() {
    printf("Enter the length of the first array: ");
    int n1;
    scanf("%d", &n1);

    int *a = (int*) malloc(sizeof(int) * n1);

    printf("Enter the elements of the first array: ");
    for (int i = 0; i < n1; i++)
        scanf("%d", &a[i]);

    printf("Enter the length of the second array: ");
    int n2;
    scanf("%d", &n2);

    int*b=(int*)malloc(sizeof(int)*n2);

    printf("enter the elements of the second array: ");
    for (int i = 0; i < n2; i++)
        scanf("%d", &b[i]);

    int size = n1 + n2;

    int *c = (int*)malloc(sizeof(int)* size);

    find_elements(a, n1, b, n2, c, &size);
    printf("Output: ");
    for (int i = 0; i < (size); i++)
        printf("%d ", c[i]);

    free(c);
    free(b);
    free(a);

    return 0;
}