Ras*_*kyz 2 c arrays malloc pointers
我正在尝试打印数组中的整数摘要.例如,如果用户键入:"1 4 5 8"结果应为:"1 5 10 18"(0 + 1 = 1,1 + 4 = 5,5 + 5 = 10,10 + 8 = 18)我使用输入运行此代码:"1 1 1"第一次结果是:"1 2 3 32767 256"和任何其他时间按预期运行:\执行此操作的算法很简单,它可以工作,但我已经习惯了OOP刚刚开始学习C.这里的东西看起来不对..用指针或malloc的东西?任何帮助?实现这个的"正确"方式是什么?干杯..!
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
/*function prototype*/
int* summary(int a[], int length);
void printArray(int array[], int i);
int main(){
int k;
int length=0;
int userArray[MAX];
printf("Enter some numbers:\n");
while((scanf("%d", &k) ==1)){
userArray[length] = k;
length++;
/*print the array after 'Enter' key pressed*/
if(getchar() == '\n'){
summary(userArray, length);
length = 0;
printf("\n");
}/*if*/
}/*while*/
summary(userArray, length);
printf("\n");
return 0;
}/*main*/
int* summary(int a[], int length){
int i;
int counter = 0;
int *p;
p = (int *) malloc(length * sizeof(int));
if(!p){
printf("memory allocation failed!");
exit(0);
}/*if null*/
for(i=0 ; i<length ; i++){
counter+=a[i];
p[i] = counter;
}/*for*/
a[length] = '\0';
printArray(p, 0);
return p;
free(p);
}/*summary*/
void printArray(int array[], int i){
if(array[i]=='\0'){
printf("finished printing");
return;
}
else{
printf(" %d\n", array[i]);
printArray(array, i+1);
}
}/*printArray*/
Run Code Online (Sandbox Code Playgroud)
问题在于这些问题
a[length] = '\0';
printArray(p, 0);
Run Code Online (Sandbox Code Playgroud)
printArray迭代,直到它找到与价值的元素0您已经尝试写一个零值超出结束a然后传递数组p到printArray. p没有任何零元素,所以printArray继续读取它超出它一段不可预测的时间,直到它崩溃或找到值为0的内存.
为了解决这个问题,你应该分配空间length+1中的元素p,然后设置p[length] = 0之前调用printArray.或者,您可以将第二个参数更改printArray为数组大小并重新实现为
void printArray(int* array, int size){
for (int i=0; i<size; i++) {
printf(" %d\n", array[i]);
}
printf("finished printing");
}/*prinArray*/
Run Code Online (Sandbox Code Playgroud)
您还需要决定如何处理你分配的内存做p在summary.您当前从函数返回此函数然后尝试free它.free(p)由于前面的return语句将控制权返回给调用函数,因此永远不会执行该行.由于没有调用者summary使用返回值,因此最简单的修复方法是更改summary为返回void并删除该return p行.
请注意,如果启用警告,编译器应标记此最后一个问题.(添加-Wall到gcc或/W4MSVC的命令行)