gpt4 book ai didi

c - 如何初始化这些指针?

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:20 25 4
gpt4 key购买 nike

我需要制作一个员工列表,但我无法更改这些结构,我在如何将每个 tab[10] 初始化为 NULL 以及如何设置值方面遇到了麻烦

#include <stdio.h>
#include <stdlib.h>

typedef struct employee Employee;

struct employee{
char name[81];
float salary;
};

Employee *tab[10]; /*a table with employee*/

void set(Employee **tab, int i, char *name, float salary){
tab[i]->name = name;
tab[i]->salary = salary;
}

int main(){

Employee *e;

int i = 0;
for(; i < 10; i++) init(i,&e);

return 0;
}


/*a table with an employee, each position must have a name and a salary*/
Employee *tab[10];

void init(int n, Employee **tab);

最佳答案

埃弗拉尔多

在评论员的帮助下,您似乎已经到达那里了。我想总结一下到目前为止给出的建议,并添加一些我自己的建议。

声明员工数组

将数组声明为全局变量,然后将其作为参数传递给函数会使事情变得有点困惑。我通常更喜欢声明一个局部变量,然后将它传递给使用它的各种函数。同样正如 David C. Rankin 所建议的那样,将每个数组元素初始化为 0 只需要您初始化声明语句中的第一个元素。不需要 FOR 循环。编译器将为您自动初始化其余的数组元素。

main()
{
Employee* tab[10] = { NULL };

. . . .
}

数组内存分配

正如 Patrick87 所提到的,您需要添加代码来为数组中的每个元素分配内存。示例初始化例程可以编码如下:

int init(int len, Employee** tab) {
int i = 0;

for (i = 0; i < len; i++)
{
if ( (tab[i] = (Employee*) calloc (1,sizeof(Employee))) == NULL )
return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}

函数使用:

if (init(10, &tab) == EXIT_FAILURE)
{
puts("CALLOC Failed, aborting....");
exit(EXIT_FAILURE);
}

注意事项:

  • 检查以确保内存已分配。失败时返回一些提醒调用者函数的失败状态类型。
  • 返回的状态代码在 stdlib.h 中定义。它们不是必需的,但确实向读者提供了明确的指示您的代码的成功和失败路径。
  • FOR 循环被移到初始化函数中。功能就处理时间而言,调用是昂贵的。自从数组大小已知,在功能。
  • 尽量编写返回状态的函数。这将使如果函数的操作,调用者执行任何错误处理失败。

设置数组元素值

以下声明无效。您不能直接将内容从字符串指针复制到字符数组。您将需要使用 strcpy、strncpy 或 memcpy 等语句来复制数据。

tab[i]->name =  name;

我更喜欢一种复制字符串的方法。

sprintf(tab[i]->name, "%.80s", name);

这会将最多 80 个字符从 name 复制到 tab[i]->name,然后插入一个空字符。该语句的美妙之处在于指定变量不必与源大小相同。如果源变量(在本例中为名称)较短,spirntf 将在遇到空字符时简单地停止,然后以空字符终止目标字符串。如果源超过 80 个字符或者缺少空终止符,sprintf 将在第 80 个字符位置停止处理,然后在第 81 个字符位置自动插入一个空字符。

一个示例 SET 例程可能如下所示:

void set(Employee** tab, int i, char* name, float salary) {
sprintf(tab[i]->name, "%.80s", name);
tab[i]->salary = salary;
}

用法:

for (i = 0; i < 10; i++)
{
set(&tab, i, "Bob", 35000. + i); // bogus values, demo purposes only
}

主要程序逻辑

您当前的主程序大纲需要更改。对于初学者,变量“e”的声明应该替换为变量“tab”的声明(参见 Patrick87 评论)。在初始化数组时,请参阅上面我的建议。要为数组元素设置值,请参阅上面的 SET 函数注释。

释放内存

每次分配内存时,都必须在完成后释放它。忘记释放分配的内存会在程序中造成内存泄漏。从技术上讲,在这个演示程序中,系统会在您的代码退出时释放内存,因此您不需要释放它。但这是一种很好的做法,因此当您开始编写真正的应用程序时,您不会忘记这样做。

这是一个如何做到这一点的例子:

for (i = 0; i < 10; i++)
free (tab[i]);

关于c - 如何初始化这些指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57742462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com