【问题标题】:How to prevent the arrays from conflict?如何防止数组冲突?
【发布时间】:2026-01-15 13:50:02
【问题描述】:

我有 3 个不同大小的数组。简单来说一个是二维的char数组,另外两个是unsigned int数组。

让他们;

char names[numberOfPeople][MAX_NAME_SIZE + 1];
unsigned int ages[numberOfPeople];
unsigned int weights[numberOfPeople];

让人们有共同的名字,所以宏MAX_NAME_SIZE被定义为10作为预处理器。 向用户询问numberOfPeople,用户使用fgets 输入它,然后经过一些程序将其读取到变量中。

有 VLA 是可以的,但是从用户那里获取 numberOfPeople 变量值的函数在数组定义之后。因此,数组在更改之前使用 numberOfPeople 的初始化值定义。

现在,问题是;如何动态分配内存然后初始化数组?我已经阅读了一些关于 calloc 的文档,但是正如您所看到的,数组不是指向数组的指针。所以我找不到使用calloc 的正确语法。返回到void *,我该如何实现呢?

我必须将数组定义为指向数组的指针吗?第一个是char 数组,这有关系吗?

【问题讨论】:

  • 为什么不在numberOfPeople初始化之后声明数组?
  • 这里不需要内存分配。只需在询问用户并验证输入后声明您的数组即可。
  • 那么,没有其他建议了吗?
  • 没有其他建议,从C99开始我们允许混合声明和语句,你应该使用它。不仅要解决这个小问题,还要提高代码的总体可读性。

标签: c malloc dynamic-memory-allocation


【解决方案1】:

也许下面的伪代码会对你有所帮助。

不是在编译时定义数组,而是在运行时动态定义它们。 因为,在编译时,您不会知道数组的大小,只需将它们定义为“指向”数组,并担心在知道数组大小后(在运行时)为数组分配内存:

char *names;
unsigned int *ages = NULL;
unsigned int *weights = NULL;

我假设(因为您没有在问题中分享此信息)您的代码具有类似于以下的存储空间,与 fgets() 一起使用以请求“人数”作为字符串:

char tmpStr[MAX_NAME_SIZE];
int numberOfPeople;

printf("Enter the number of people: *");
fgets(tempStr, sizeof(tmpStr), stdin);
numberOfPeople = atoi(tmpStr);

既然您知道了 numberOfPeople,请分配一个名称指针数组、一个年龄整数数组和一个权重整数数组。

names = malloc(numberOfPeople * sizeof(*names));
ages = malloc(numberOfPeople * sizeof(*ages));
weights=malloc(numberOfPeople * sizeof(*weights));

为了初始化数组,我(再次)假设您的代码执行类似于 for 循环的操作,您在其中向用户询问各种数组元素:

for(i=0; i<numberOfPeople; ++i)
   {
   printf("Enter name #%d: ", i);
   fgets(tmpStr, sizeof(tmpStr), stdin);

现在,分配内存,并将输入的名称存储在名称数组中。

   names[i] = strdup(tmpStr);

“strdup()”函数在内部调用“malloc()”,分配刚好足够的内存来存储指定的字符串(tmpStr);然后它将字符串(tmpStr)复制到分配的内存,并返回分配的内存地址;分配给'names[i]'。

然后从用户那里获取年龄:

   printf("Enter age #%d: ", i);
   fgets(tmp, sizeof(tmpStr), stdin);

   ages[i] = atoi(tmpStr);

然后得到...

...

【讨论】: