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

如何在c中访问动态数组中的数据?,c,arrays,dynamic,C,Arrays,Dynamic,我使用了两个不同的数组。有了一个,我得到了我想要的确切结果,另一个,没有那么多。我通过读取类似以下内容的文本文件来归档数组: 2597 283 4 723 21 82 426 前五行是客户ID。始终有5行,但它们并不总是有值。下一行是供应商数量,然后是供应商ID void use_arrays() { int i, customer_count, *customer_ids, vendor_count,

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

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);
}
一旦阵列打印出来,客户ID将显示正确的数字,但供应商ID将从内存中打印出随机数字。更令人沮丧的是,它从填充数组内部正确地打印供应商。

如果您想以填充数组中的方式修改供应商ID,则必须将其作为指向指针的指针传入:

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;
您还必须对客户ID进行相同的更改。客户ID工作而供应商ID不工作的事实可能是由于您使用了realloc。如果realloc决定必须将内存块重新分配到一个新位置,您将遇到这些问题,但是如果将内存重新分配到同一位置,您传入的指针仍然指向那里。由于您永远不知道realloc是否会进行该描述,因此客户ID和供应商ID都应作为指向指针的指针传入。

如果您希望以填充数组的方式修改供应商ID,则必须将其作为指向指针的指针传入:

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;

您还必须对客户ID进行相同的更改。客户ID工作而供应商ID不工作的事实可能是由于您使用了realloc。如果realloc决定必须将内存块重新分配到一个新位置,您将遇到这些问题,但是如果将内存重新分配到同一位置,您传入的指针仍然指向那里。因为您永远不知道realloc是否会做出这样的描述,所以客户ID和供应商ID都应该作为指向指针的指针传入。

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

如果你有这样一个函数

void fooint a

您不能更改foo的内部,foo只获取a的副本

void fooint*a

otoh给foo a的地址,也就是说,我知道你住在哪里。它可以让你更改a指向的内容。如果指向数组,则可以更改该数组的内容;如果指向单个整数,则可以更改该数组的内容

void fooint**a


不仅可以更改a指向的对象,还可以更改它指向的位置。所以如果你想要一个指向其他地方的点,你可以。这就是您在函数中需要的,如果您在函数中执行malloc/calloc/realloc来返回结果,您需要这个

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

如果你有这样一个函数

void fooint a

您不能更改foo的内部,foo只获取a的副本

void fooint*a

otoh给foo a的地址,也就是说,我知道你住在哪里。它可以让你更改a指向的内容。如果指向数组,则可以更改该数组的内容;如果指向单个整数,则可以更改该数组的内容

void fooint**a


不仅可以更改a指向的对象,还可以更改它指向的位置。所以如果你想要一个指向其他地方的点,你可以。这就是您在函数中所需要的,如果您在函数中执行malloc/calloc/realloc来返回您需要的结果,那么一个好的提示就是始终检查返回代码,通常是在您认为经常出错的情况下。重新分配是一个代价高昂的操作,当您重新分配时,请分配一个块。如果你知道你正在阅读5个数字,那么我会重新分配5个数字,因为我不知道会有多少个数字。可能有5个,但也可能只有一个。是的,但当你重新分配时,你可以说一次分配10个对象,而不是一个。然后,如果你用完了这10个,再分配10个。一个好的建议是总是检查返回码,通常是在你认为返回码经常出错的时候。重新分配是一个代价高昂的操作,当你重新分配时,分配一个块。如果你知道你正在阅读5个数字,那么我会重新分配5个数字,因为我不知道会有多少个数字。可能有5个,但也可能只有一个。是的,但当你重新分配时,你可以说一次分配10个对象,而不是一个。然后,如果你用完了这10个,再分配10个客户ID将需要相同的。@netcoder+1在末尾添加了一个关于这一点的简介。谢谢你的提醒。很好,谢谢。我用这个工作。但是,当我将其添加到客户ID中时,我遇到了访问冲突。我
我猜我可能做错了什么。“但我很好奇,如果我得到了正确的答案,让它保持原样有什么危险呢?”vikingsfan19很乐意帮忙。我能看看你得到访问权限的那一行代码吗?另外,让代码保持原样的危险在于,当您realloc并且分配内存的位置决定需要更改时,您现在有一个指向垃圾数据的延迟指针,一旦函数结束,如果您没有使用指向指针的指针,则新位置的分配内存将只是四处浮动,未处理。又名内存泄漏啊,事实上我知道了。我刚刚错过了一个点。客户ID也需要同样的信息。@netcoder+1在结尾添加了一个关于这个的简介。谢谢你的提醒。很好,谢谢。我用这个工作。但是,当我将其添加到客户ID中时,我遇到了访问冲突。我猜我可能做错了什么。“但我很好奇,如果我得到了正确的答案,让它保持原样有什么危险呢?”vikingsfan19很乐意帮忙。我能看看你得到访问权限的那一行代码吗?另外,让代码保持原样的危险在于,当您realloc并且分配内存的位置决定需要更改时,您现在有一个指向垃圾数据的延迟指针,一旦函数结束,如果您没有使用指向指针的指针,则新位置的分配内存将只是四处浮动,未处理。又名内存泄漏啊,事实上我知道了。我只是错过了一个点。所以我尝试这样做的方式基本上就像发送数组的副本一样?这就是为什么额外的*是必要的吗?填写表格*客户数量,。。永远不会允许您更改customer_count的大小,因为realloc会在内存中创建一个新块,所以我尝试的方法本质上就像发送阵列的副本一样?这就是为什么额外的*是必要的吗?填写表格*客户数量,。。决不允许您更改customer_计数的大小,因为realloc在内存中创建了一个新块