C:如何修改结构中字符串的最大大小?

标签 c pointers struct dynamic-memory-allocation

习题给出了一个创建数据库的简单程序,这个程序围绕着下面的结构展开

struct Address {
  int id;
  int set;
  char name[MAX_DATA];
  char email[MAX_DATA];
};

我被要求修改代码,以便我可以将 .name.email 的最大长度作为参数传递给程序。现在,当然,如果我没有将 MAX_DATA 定义为宏,而是将其作为全局变量使用,我会得到错误:在文件范围内可变修改的“名称”

然后我尝试创建不同的 if 循环,旨在通过重新定义 struct Address 来传递 MAX_DATA 值,例如:

if(argc > 6) {
  int maxdata = atoi(argv[6]);
  struct Address {
    int id;
    int set;
    char name[maxdata];
    char email[maxdata];
  };
  DatabaseSet(conn, id, argv[4], argv[5]);
  DatabaseWrite(conn);
  break;
}

但是 DatabaseSetDatabaseWrite(它们在与另一个 struct Database 相关的 struct Connection 上工作,谁finally 直接与 struct Address 相关)忽略 nameemail 的新长度。

编辑:谢谢。

谢谢大家的评论和回答,你们真的帮助我完成了练习,也帮助我理解了 C。

最佳答案

  struct Address {
    int id;
    int set;
    char *name;
    char *email;
  };

然后根据您的MAXDATA 输入在nameemail 中动态分配内存。

然后你这样做struct Address p

p.name = malloc(MAXDATA);
if( p.name == NULL ){
   fprintf(stderr,"%s\n","Error in memory allocation");
   exit(1);
}

然后当你完成使用它时

free(p.name);

如果您为 email 分配内存,您将必须按照前面所示的正常方式对其调用 free()

关于C:如何修改结构中字符串的最大大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818838/

相关文章:

c - 在 win32api 中直接读写硬盘,如 biosdisk 或 ms-dos 中的 absread

c - 两个进程共享内存

c - 指向 uint 数组的指针

c++ - 仅使用标准库创建 "Vector of References"的标准实践

c - 指向整数数组的指针与指向整数的 double 指针

c - 从文件中获取行,放入结构数组,打印内容(作业)

c - 在C函数中传递不同的数据成员

c - 删除 '//' &/*...*/c 文件中的注释以使用 c 获取预处理文件

c - 为什么 64 位 Windows 上原生 long 原语的大小只有 4 个字节?

c - 指向结构中其他结构的指针