C 如何防止阵列冲突?

C 如何防止阵列冲突?,c,malloc,dynamic-memory-allocation,C,Malloc,Dynamic Memory Allocation,我有3个不同大小的数组。一个是2Dchararray,另外两个是unsigned int数组 让他们 char names[numberOfPeople][MAX_NAME_SIZE + 1]; unsigned int ages[numberOfPeople]; unsigned int weights[numberOfPeople]; 让人们有共同的名字,这样宏MAX\u NAME\u SIZE被定义为10作为预处理器。 numberOfPeople被询问给用户,用户用fgets输入它,经

我有3个不同大小的数组。一个是2D
char
array,另外两个是
unsigned int
数组

让他们

char names[numberOfPeople][MAX_NAME_SIZE + 1];
unsigned int ages[numberOfPeople];
unsigned int weights[numberOfPeople];
让人们有共同的名字,这样宏
MAX\u NAME\u SIZE
被定义为10作为预处理器。
numberOfPeople
被询问给用户,用户用
fgets
输入它,经过一些过程后,它被读取到变量中

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

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


我必须将数组定义为指向数组的指针吗?第一个是
char
数组,它重要吗

也许下面的伪代码可以帮助您

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

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

char tmpStr[MAX_NAME_SIZE];
int numberOfPeople;

printf("Enter the number of people: *");
fgets(tempStr, sizeof(tmpStr), stdin);
numberOfPeople = atoi(tmpStr);
现在您知道了numberOfPeople,分配一个名称指针数组、一个ages整数数组和一个权重整数数组

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);
“strdup()”函数在内部调用“malloc()”,只分配足够的内存来存储指定的字符串(tmpStr);然后将字符串(tmpStr)复制到分配的内存中,并返回分配内存的地址;分配给“名称[i]”的

然后从用户处获取年龄:

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

   ages[i] = atoi(tmpStr);
那就

...

为什么不在初始化
numberOfPeople
之后声明数组呢?这里不需要内存分配。在询问用户并验证输入后,只需声明数组。因此,没有任何其他建议?没有其他建议,我们可以混合声明和语句,因为C99,您应该使用它。不仅要解决这个小问题,还要提高代码的可读性。
   printf("Enter age #%d: ", i);
   fgets(tmp, sizeof(tmpStr), stdin);

   ages[i] = atoi(tmpStr);
...