在函数中插入数字到指针数组

insert numbers to pointer array in function

我写了一段代码,基本上它的作用是从用户那里获取名为 array 的动态数组的大小和要插入其中的数字,然后将数组发送给函数 PartialSums.

PartialSums应该从array[i]取数,加到sum,然后把sum放到newarray[i],直到结束arraysize 的数组,之后它应该 return newarray 返回到 main 并打印两个数组。

我想您可以将其视为 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

第一个数字每次都变

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

时出现问题

或者它的东西 returning newarray 回到 main

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

你的程序有几个错误:

  1. do-while循环中的循环条件应该是flag == 0。使用 flag = 0 将零分配给 flag 并且循环永远不会重复。

  2. 赋值应该是

    newarray = PartialSums(arrsize, array);
    

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

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

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

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

有多个错误:

  • do / while 循环的逻辑被破坏:测试 flag = 0 flag 设置为 0 而不是与 0 进行比较。此外,您必须在循环内将 flag 设置为 1。如果可以分配数组,使用 for(;;) 循环并显式中断它实际上更简单。
  • main() 中分配 newarray 没有任何意义。
  • 应在 PartialSums.
  • 中测试内存分配失败
  • 存储 PartialSums 中的 return 值应该只是 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;
}