1

我有一个我写的代码,基本上它的作用是array从用户那里获取一个命名的动态数组的大小和要插入它的数字,然后将数组发送到函数PartialSums

PartialSums应该从 中获取数字array[i],将其添加到 中sum,然后放入sumnewarray[i]直到数组的末尾arraysize,之后它应该返回newarraymain打印两个数组。

我想您可以将其视为每个单元格array与之前的单元格的阶乘,但它将数字相加而不是相乘。

最后应该包含的内容示例newarray

arraysize = 5
array = 1,2,3,4,5

newarray should be: 1,3,6,10,15 
just to show what it looks like mathematically: 1,2+1,3+2+1,4+3+2+1,5+4+3+2+1

这是代码:

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

int *PartialSums(int arrsize, int *array) {
    int *newarray;
    int sum = 0;
    int i;
    newarray = (int *)malloc(arrsize * sizeof(int));
    for (i = 0; i < arrsize; i++) {
        sum = sum + array[i];
        newarray[i] = sum;
    }
    return newarray;
}

int main() {
    int *array;
    int *newarray;
    int arrsize;
    int num;
    int flag = 1;
    int i;
    do {
        printf("please insert amount of numbers to enter\n");
        scanf("%d", &arrsize);
        array = (int *)malloc(arrsize * sizeof(int));
        newarray = (int *)malloc(arrsize * sizeof(int));
        /* if memory cannot be allocated */
        if (array == NULL || newarray == NULL) {
            printf("Error! memory not allocated.\n\n");
            flag = 0;
        }
    } while (flag = 0);

    for (i = 0; i < arrsize; i++) {
        printf("please insert a number: ");
        scanf("%d", &num);
        array[i] = num; 
    }
    *newarray = PartialSums(arrsize, array);
    printf("this is the main array: ");
    for (i = 0; i < arrsize; i++) {
        printf("%d", array[i]);
        if (i < arrsize - 1)
            printf(",");
    }
    printf("\nthis is the new array: ");
    for (i = 0; i < arrsize; i++) {
        printf("%d", newarray[i]);
        if (i < arrsize - 1)
            printf(",");
    }
    free(array);
    free(newarray);
    return 0;
}

直到总和部分一切正常,但由于某种原因,打印是这样的:

这是新数组: 18825296,0,0,0,0

第一个数字每次都会改变

我猜问题出在函数中,这意味着插入sumnewarray

或者它的东西newarray回到main

问题是我不知道我做错了什么,希望你们能帮助我理解。

4

2 回答 2

2

您的程序中有一些错误:

  1. do-while 循环中的循环条件应该是flag == 0. 随着flag = 0您将零分配给标志,循环永远不会重复。

  2. 任务应该是

    newarray = PartialSums(arrsize, array);
    

    也就是说,没有指针取消引用。

  3. 正如WhozCraig所指出的,当newarray被分配PartialSums的结果时,您会发生内存泄漏;您不需要在 main 函数中为newarray分配内存。

您还应该通过检查scanf的返回值来确保输入有效。在结果之后打印一个换行符也是一个好主意,以确保它在非 Windows 系统上也能正确显示。

提示:在使用动态分配的数组时,将数组的名称及其长度放在一起很有用。因此,我总是使用带有后缀Len的数组名称作为数组长度变量。在您的情况下,它将是arrayLennewarrayLen。使用这种方法,您永远不会混淆不同的数组长度(即使在这个程序中只有一个长度)。

于 2020-11-27T09:27:14.503 回答
0

有多个错误:

  • do/while循环的逻辑被破坏:测试flag = 0 设置 flag0而不是比较0。此外,您必须设置flag1循环内部。for(;;)如果可以分配数组,使用循环并显式中断它实际上更简单。
  • newarray分配在中毫无用处main()
  • 内存分配失败应该在PartialSums.
  • 存储返回值 fromPartialSums应该newarray = PartialSums(arrsize,array);就像编码一样,你正在修补newarray你分配的第一个条目main(),这解释了观察到的行为。

这是一个更正的版本:

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

int *PartialSums(int arrsize, int *array) {
    int *newarray = (int *)malloc(arrsize * sizeof(int));
    if (newarray != NULL) {
        int sum = 0;
        for (int i = 0; i < arrsize; i++) {
            sum = sum + array[i];
            newarray[i] = sum;
        }
    }
    return newarray;
}

int flush_input(void) {
    int c;
    while ((c = getchar()) != EOF && c != '\n')
        continue;
    return c;
}

int main() {
    int *array;
    int *newarray;
    int arrsize;
    for (;;) {
        printf("please insert amount of numbers to enter:\n");
        if (scanf("%d", &arrsize) != 1 || arrsize <= 0) {
            printf("invalid input\n");
            if (flush_input() == EOF)
                return 1;
            continue;
        }
        array = (int *)malloc(arrsize * sizeof(int));
        /* if memory cannot be allocated */
        if (array == NULL) {
            printf("Error! memory not allocated.\n\n");
        } else {
            break;
        }
    }

    for (int i = 0; i < arrsize;) {
        printf("please insert a number for array[%d]: ", i);
        if (scanf("%d", &array[i]) == 1) {
            i++;
        } else {
            printf("invalid input\n");
            if (flush_input() == EOF)
                return 1;
        }
    }
    printf("This is the main array: ");
    printf("%d", array[0]);
    for (int i = 1; i < arrsize; i++) {
        printf(",%d", array[i]);
    }
    printf("\n");

    newarray = PartialSums(arrsize, array);
    if (newarray) {
        printf("This is the new array: ");
        printf("%d", newarray[0]);
        for (int i = 1; i < arrsize; i++) {
            printf(",%d", newarray[i]);
        }
        printf("\n");
        free(newarray);
    } else {
        printf("Memory allocation failure\n");
    }
    free(array);
    return 0;
}
于 2020-11-27T10:01:50.413 回答