c-如何防止数组发生冲突



我有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,那么就分配一个名称指针数组、一个年龄整数数组和一个权重整数数组。

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);

然后。。。

...

相关内容

  • 没有找到相关文章

最新更新