c - 用于读取数据库的损坏的 C 代码

标签 c segmentation-fault scanf strcmp

我有一段代码,用 C 语言从 passwd 风格的数据库中读取条目:

do {
    if (fscanf(db, "%s:%s:%d", uname, passwd, &gid) == EOF) {
        return NULL;
    }
} while (strcmp(uname, username));

但是,当运行它时,它给出了段错误。在调试器中运行后,我发现 strcmp 部分是引发段错误的部分。数据类型:

  • dbFILE *,已经打开。
  • unamepasswd都是char *,都初始化为NULL
  • 用户名char [64]
  • gidint

我该如何解决这个问题,或者如何在不需要使用这个丑陋的 hack 的情况下解析数据库?

最佳答案

如果字符串变量 unamepasswd 都只是指针,没有指向任何地方,你认为当 fscanf 时会发生什么尝试使用这些指针并将字符串写入内存?

这将导致未定义的行为,在 strcmp 调用中完成的取消引用也是如此。

unamepasswd 变量也应该使用数组。

关于c - 用于读取数据库的损坏的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34203494/

相关文章:

c++ - 静态模板类的奇怪行为

c++ - 一个简单的随机数排序程序

c - 使用带有 "%c"的 scanf() 时的前导空格

c - 为什么 fscanf/scanf 正在更改 Ideone.com 上先前扫描的变量的值?

颜色转换在 opencv 中不起作用?

c - 为什么 (int)((int *)0 + 4) == 16?

c++ - 最快的时间分辨率系统

c - 在我的 C 程序中出现 SIGSEGV 错误

c - fork后如何通过键盘在子进程中引入字符串

C函数错误: is it better to abort the function or simply exit the program?