3

我正在尝试创建一个数组来保存一个 int,然后当要添加另一个 int 时增加它的大小以保存另一个 int.. 等等..

我知道这不是 realloc 的有效使用,但它比其他任何东西都更能证明概念。只要让它工作,我就可以优化它并能够将它应用到有用的东西上。一个工作示例。当我调用打印函数并且它只是段错误时,问题就来了。任何帮助,将不胜感激。

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

typedef char String[100];

void begin(int *);
void add(int *, int);
void print(int *);

int tempcount=0;

int main(void)
{
    int *n=NULL;
    String menu;

    begin(n);

    while(true)
    {
        scanf("%9s", menu);

        if(!strcmp("a", menu)) //add
        {
            int i=0;
            scanf("%d", &i);
            add(n, i);
        }
        else if(!strcmp("p", menu)) //print
        {
            print(n);
        }
        else if(!strcmp("q", menu)) //quit
        {
            free(n);
            break;
        }

    }

    return 0;
}

void begin(int *n)
{
    n=malloc(sizeof(int));

    if(n==NULL)
    {
        printf("Error in malloc!");
        return;
    }

    n[0]=0;

    printf("Added %d \n", n[0]);
}

void add(int *n, int numToAdd)
{
    static int sizeCount=0;
    sizeCount++;
    tempcount=sizeCount;

    int *temp;

    temp=realloc(n, (sizeCount+1) * sizeof(int));

    if(temp==NULL)
    {
        printf("Error in realloc!");
        return;
    }

    n=temp;

    n[sizeCount]=numToAdd;

    printf("Added %d \n", n[sizeCount]);

}

void print(int *n)
{
    int i;
    for(i=0; i<tempcount; i++)
    {
        printf("%d ", n[i]);
    }
}
4

2 回答 2

8

您需要在 add/begin 中将指针传递给您的指针,以便他们可以在 main 中修改您的指针

begin(&n);
...
add(&n, i);

和你的定义

void begin(int **n)
{
    *n=malloc(sizeof(int));

    if(*n==NULL)
    {
        printf("Error in malloc!");
        return;
    }

    (*n)[0]=0;

    printf("Added %d \n", (*n)[0]);
}

void add(int **n, int numToAdd)
{
    static int sizeCount=0;
    sizeCount++;
    tempcount=sizeCount;

    int *temp;

    temp=realloc(*n, (sizeCount+1) * sizeof(int));

    if(temp==NULL)
    {
        printf("Error in realloc!");
        return;
    }

    *n=temp;

    (*n)[sizeCount]=numToAdd;

    printf("Added %d \n", (*n)[sizeCount]);

}

现在您正在做的是在开始/添加中修改指针的本地副本,因此当您在这些函数中更改它时,它不会n在 main 中修改您的指针

另外,有趣的事实是,如果您将NULL其作为第一个参数传递给realloc它,它的行为就像 a malloc,所以如果您初始化nNULL,您可以简单地调用add而无需先执行 a begin

于 2012-11-02T19:25:31.520 回答
0

检查您的函数添加 - 您确定更新指针值吗?尝试使用 ** 作为参数 - 我认为它会有所帮助。

于 2012-11-02T19:30:49.807 回答