我有 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 数组,这重要吗?
最佳答案
也许下面的伪代码会对您有所帮助。
不要在编译时定义数组,而是在运行时动态定义它们。 因为在编译时,您不会知道数组的大小,只需将它们定义为“指向”数组,并在知道数组大小后(在运行时)担心为数组分配内存:
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);
然后得到...
...
关于c - 如何防止数组冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23328395/