我有两个不同的阵列,我正在使用。有一个,我得到了我想要的确切结果,另一个,不是那么多。我通过读取与此类似的文本文件来填充数组:
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
内部正确打印供应商。
答案 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_ids
在vendor_ids
期间不起作用的事实可能是由于您使用了realloc
。如果realloc
决定必须在新位置重新分配内存块,则会遇到这些问题,但如果在同一位置重新分配内存,则传入的指针仍然指向那里。由于你永远不知道realloc
是否会做出这种决定,customer_ids
和vendor_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来返回你需要的结果