如何从c中的动态数组访问数据?

时间:2013-01-22 19:16:55

标签: c arrays dynamic

我有两个不同的阵列,我正在使用。有一个,我得到了我想要的确切结果,另一个,不是那么多。我通过读取与此类似的文本文件来填充数组:

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内部正确打印供应商。

2 个答案:

答案 0 :(得分:4)

如果要在vendor_ids中修改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_idsvendor_ids期间不起作用的事实可能是由于您使用了realloc。如果realloc决定必须在新位置重新分配内存块,则会遇到这些问题,但如果在同一位置重新分配内存,则传入的指针仍然指向那里。由于你永远不知道realloc是否会做出这种决定,customer_idsvendor_ids都应该作为指针的指针传入。

答案 1 :(得分:0)

你似乎对如何从函数返回内存感到困惑。

如果你有一个看起来像这样的功能

void foo(int a);

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

void foo(int *a);

otoh给foo一个地址,即“我知道你住在哪里”它可以让你改变a指向的地址。如果a指向一个数组,则可以更改该数组的内容,如果指向一个整数,则可以更改该数组。

void foo(int **a);

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