C动态内存分配数组

Kid*_*des -1 c arrays

我的程序在main函数中声明了3个int数组(指针).用户输入数组的长度,A然后用随机数填充.

然后,调用一个函数,该函数将所有3个数组作为其参数.它从数组中获取所有偶数A,并将它们放入数组B,并将所有奇数放入数组中C.尺寸BC需要与其元素的数量相同.B然后打印元素.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int velA, velB, velC; //the sizes of all the arrays

void napravi(int a[], int *b, int *c);

void main() {
    int *a, *b, *c;
    int i;
    srand(time(NULL));

    printf("Enter array lenght:"); 
    scanf("%d", &velA);
    getchar();

    a = (int*)calloc(velA, sizeof(int));
    b = (int*)malloc(4); //I have to initialize the variable in order to pass it as an argument ?
    c = (int*)malloc(4);

    for(i = 0; i < velA; i++) {
        a[i] = rand() %101;
    }

    napravi(a, b, c);

    for(i = 0; i < velB; i++) {
        printf("%d  ", b[i]);
    }

    free(a);
//  free(b); //Windows has triggered a breakpoint in .exe
//  free(c);
    getchar();
}

void napravi(int a[], int *b, int *c) {
    int i;
    int j = 0, k = 0;

    for(i = 0; i < velA; i++) {
        if(a[i] % 2 == 0) {
            j++;
        }
        else {
            k++;
        }
    }
    free(b);
    free(c);
    b = (int*)calloc(j, sizeof(int));
    c = (int*)calloc(k, sizeof(int));


    j = 0; k = 0;

    for(i = 0; i < velA; i++) {
        if(a[i] % 2 == 0) {
            b[j] = a[i];
//          printf("\n%d | %d", a[i], b[j]);
            j++;
        }
        else {
            c[k] = a[i];
            k++;
        }
    }
    velB = j;
    velC = k;
}
Run Code Online (Sandbox Code Playgroud)

这段代码有2个问题.

  • 首先,如果用户输入的值大于~420左右,则会开始打印垃圾值,如-17987777 ...
  • 其次,当我尝试在结束时释放(b)和释放(c)时,程序崩溃并出现错误"Windows已在my.exe中触发了断点".

Sou*_*osh 5

in C,函数参数按值传递.所以,从napravi()功能上来说,你无法改变b自己.但是,您当然可以更改adrress指向b,即*b.

如果您需要更改bnapravi(),你需要一个指针传递给bmain().

如果用户输入的值大于~420左右,则会开始打印垃圾值,如-17987777 ...

您在代码中遇到未定义的行为.

for(i = 0; i < velB; i++) {
        printf("%d  ", b[i]);
    }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,velB值正确更新(正如代码所预期的那样),但b不是(正如napravi()函数所预期的那样).所以,你正在超出分配的内存区域,创建UB.

当我尝试在结束时释放(b)和释放(c)时,程序崩溃并出现错误"Windows已触发my.exe中的断点".

UB的结果.


注意:请不要输入malloc()和家人的返回值C.