2

我有两个不同的数组,我正在使用。一个,我得到了我想要的确切结果,另一个,不是那么多。我通过读取类似于以下内容的文本文件来归档数组:

2597
283



4
723
21
82
426

前五行是客户 ID。总是有 5 行,但它们并不总是有价值。下一行是供应商的数量,然后是供应商 ID。

void use_arrays()
{
    int
        i,
        customer_count,
        *customer_ids,
        vendor_count,
        *vendor_ids;

    customer_ids = malloc(sizeof(int));
    vendor_ids = malloc(sizeof(int));
    fill_arrays(&customer_count, customer_ids, &vendor_count, vendor_ids);

    for (i = 0; i < customer_count; i++)
    {
        printf("Customer[%d]: %d\n", i, customer_ids[i]);
    }

    for (i = 0; i < vendor_count; i++)
    {
        printf("Vendor[%d]: %d\n", i, vendor_ids[i]);
    }

    free(customer_ids);
    free(vendor_ids);
}

void fill_arrays(int *customer_count, int *customer_ids, int *vendor_count, int *vendor_ids)
{
    int
        i,
        *temp,
        customer_id,
        vendor_id,
        num_cust = 0;
    FILE
        *inp_file;
    char
        *endptr = NULL,
        buffer[500];

    inp_file = fopen(g_filename, "r");

    for (i = 0; i < 5; i++) /* Can't be more than 5 customers */
    {
        fgets(buffer, sizeof(buffer), inp_file);
        customer_id = strtol(buffer, &endptr, 0);
        if (customer_id != 0)
        {
            customer_ids[i] = customer_id;
        temp = realloc(customer_ids, (i+2)*sizeof(int));
        if (temp != NULL) 
            {
               customer_ids = temp;
            } 
        else 
        {
               printf("Couldn't allocate memory\n");
            }
        num_cust++;
        }
    }
    *customer_count = num_cust;

    /* Next is number of vendor ids*/
    fgets(buffer, sizeof(buffer), inp_file);
    *vendor_count = strtol(buffer, &endptr, 0);

    temp = realloc(vendor_ids, *vendor_count*sizeof(int));
    if (temp != NULL) 
    {
        vendor_ids = temp;
    } 
    else 
    {
        printf("Couldn't allocate memory\n");
    }

    for (i = 0; i < *vendor_count; i++)
    {
        fgets(buffer, sizeof(buffer), inp_file);
        vendor_id = strtol(buffer, &endptr, 0);
        if (vendor_id != 0)
        {
        vendor_ids[i] = vendor_id;
        }
    }
    fclose(inp_file);
}

一旦数组打印出来,customer_ids就会显示正确的数字,但vendor_ids会从内存中打印出随机数。更令人沮丧的是,它从内部正确打印了供应商fill_arrays

4

2 回答 2

4

如果要修改vendor_idsin 的方式fill_arrays,则必须将其作为指向指针的指针传递:

fill_arrays(int *customer_count, int *customer_ids, int *vendor_count, int **vendor_ids)

像这样称呼它:

fill_arrays(&customer_count, customer_ids, &vendor_count, &vendor_ids);

然后你可以像这样重新分配:

temp = realloc(*vendor_ids, *vendor_count*sizeof(int));
if (temp != NULL) 
{
    *vendor_ids = temp;
} 

此外,在您的功能结束时:

vendor_ids[i] = vendor_id;

将不得不更改为

(*vendor_ids)[i] = vendor_id;

您还必须对customer_ids. customer_ids工作而没有工作的事实vendor_ids可能是由于您使用了realloc. 如果realloc决定必须在新位置重新分配内存块,您会遇到这些问题,但如果在同一位置重新分配内存,您传入的指针仍指向那里。由于您永远不知道是否realloc会做出该决定,因此两者customer_idsvendor_ids都应该作为指向指针的指针传入。

于 2013-01-22T19:22:05.247 回答
0

您似乎有点困惑如何从函数返回内存。

如果你有一个看起来像这样的函数

void foo(int a);

你不能a在 foo 里面改变,foo 只能得到一个副本。

void foo(int *a);

otoh 为 foo 提供了 a 的地址,即“我知道你住在哪里”,它可以让你更改a指向的内容。如果a指向一个数组,那么您可以更改该数组的内容,如果 a 指向一个整数,您可以更改它。

void foo(int **a);

不仅可以更改a指向的内容,还可以更改指向的位置。因此,如果您想a指向其他地方,则可以。这是您在函数中需要的,如果您在函数中执行 malloc/calloc/realloc 以返回您需要的结果

于 2013-01-22T19:43:38.397 回答