我不能保留旧条目

时间:2010-12-20 14:31:50

标签: c programming-languages

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

void push(int p)
{
    static int i=0;
    int b;
    int *ptr =(int *)malloc((10)*sizeof(int));
    ptr[i]=p;
    for(b=0;b<=i;b++){
    printf("%d",ptr[b]);
    printf("\n");
    }
    i++;
}
int main()
{
    int a;
    while(1)
    {
    scanf("%d",&a);
    push(a);
    }
}

当我输入新值时,功能不是保留旧条目。我等待你的帮助。

3 个答案:

答案 0 :(得分:2)

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

void push(int p)
{
    static int i = 0;
    static int ptr[10]; // since you are NOT freeing this memory later, 
                        // there's no need to use malloc.
    ptr[i] = p;

    int b;
    for (b = 0; b <= i; b++)
    {
        printf("ptr[%d] --> %d\n", b, ptr[b]);
    }

    printf("\n");

    i++;
}

int main()
{
    int a;
    while(1)
    {
        scanf("%d",&a);
        push(a);
    }

    return 0;  // main() expects you to return something, remember?
}

答案 1 :(得分:1)

每次调用push()时,都会分配新内存来保存10个整数。你没有做任何事情来保存指向那个记忆的指针。

这称为内存泄漏,因为你正在分配内存,但你永远不会释放内存。如果你足够多次调用push(),你可能会耗尽内存。

答案 2 :(得分:1)

您必须只分配一次。每次调用函数push时,您都会创建内存泄漏。离开功能后,没有人会提到记忆。您可以将其设置为静态以保留信息。请注意,您还要限制在10处可以容纳的值的数量。

void push(int p)
{
    static int i=0;
    static int *ptr =(int *)malloc((10)*sizeof(int)); // To keep the values
    int b;
    ptr[i]=p;
    for(b=0;b<=i;b++){
        printf("%d",ptr[b]);
        printf("\n");
    }
    i++;
    if( i >= 10 ) i = 0; // To make sure there is no overflow
}

更好的是,您可以传入要保存信息的位置。

void push(int p, int *ptr)
{
    static int i=0;
    int b; 
    ptr[i] = b;
    for(b=0;b<=i;b++){
       printf("%d",ptr[b]);
       printf("\n");
    }
    i++;
    if( i >= 10 ) i = 0; // To make sure there is no overflow
}
int main()
{
    int a;
    int values[10];
    while(1)
    {
       scanf("%d",&a);
       push(a, values);
    }
}