我有3个不同的可变大小数组。一个简单的是2D 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数组,这重要吗?

最佳答案

也许下面的伪代码将对您有所帮助。

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

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,分配一个名称指针数组,一个ages整数数组和一个weights整数数组。

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数组中。

   names[i] = strdup(tmpStr);


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

然后从用户获取年龄:

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

   ages[i] = atoi(tmpStr);


然后得到...

...

关于c - 如何防止阵列冲突?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23328395/

10-11 20:57