在函数中插入数字到指针数组
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
问题是我不知道我做错了什么,希望大家能帮我理解。
你的程序有几个错误:
do-while循环中的循环条件应该是flag == 0
。使用 flag = 0
将零分配给 flag 并且循环永远不会重复。
赋值应该是
newarray = PartialSums(arrsize, array);
也就是说,没有指针取消引用。
正如 WhozCraig 所指出的,当 newarray 被分配 PartialSums 的结果时,您会发生内存泄漏;您不需要在主函数中为 newarray 分配内存。
您还应该通过检查 scanf 的 return 值来确保输入有效。在结果后打印一个换行符也是一个好主意,以确保它在非 Windows 系统上也能正确显示。
提示:使用动态分配的数组时,将数组的名称与其长度保持在一起很有用。因此,我总是使用带有后缀 Len 的数组名称作为数组长度变量。在您的情况下,它将是 arrayLen 和 newarrayLen。使用这种方法,您永远不会混淆不同的数组长度(即使在这个程序中只有一个长度)。
有多个错误:
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;
}
我写了一段代码,基本上它的作用是从用户那里获取名为 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
问题是我不知道我做错了什么,希望大家能帮我理解。
你的程序有几个错误:
do-while循环中的循环条件应该是
flag == 0
。使用flag = 0
将零分配给 flag 并且循环永远不会重复。赋值应该是
newarray = PartialSums(arrsize, array);
也就是说,没有指针取消引用。
正如 WhozCraig 所指出的,当 newarray 被分配 PartialSums 的结果时,您会发生内存泄漏;您不需要在主函数中为 newarray 分配内存。
您还应该通过检查 scanf 的 return 值来确保输入有效。在结果后打印一个换行符也是一个好主意,以确保它在非 Windows 系统上也能正确显示。
提示:使用动态分配的数组时,将数组的名称与其长度保持在一起很有用。因此,我总是使用带有后缀 Len 的数组名称作为数组长度变量。在您的情况下,它将是 arrayLen 和 newarrayLen。使用这种方法,您永远不会混淆不同的数组长度(即使在这个程序中只有一个长度)。
有多个错误:
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;
}