【发布时间】:2021-03-08 06:51:28
【问题描述】:
我有 2 个头文件,login.h 和 inmenu.h。 login.h 也包含了 inmenu.h。
现在 login.h 定义了一个外部变量 extern char *password_login,它位于 var.h 头文件中
printf("Enter the password: \n");
char *password_login = (char *)calloc(MAX, sizeof(char));
scanf("%1000s", password_login);
之后,当我从 inmenu 头文件调用 inmenu() 函数并尝试访问 password_login 值
char *tmpsqluppass = concatsqluppass(password_login, newpass);
这没有说明对 password_login 的未定义引用
/usr/bin/ld: /tmp/ccKZpQvi.o: 警告:针对password_login' in read-only section .text'的重定位
/usr/bin/ld: /tmp/ccKZpQvi.o: 在函数inmenu': /home/legacy/Documents/project/src/../include/inmenu.h:27: undefined reference to password_login'
/usr/bin/ld:警告:在 PIE 中创建 DT_TEXTREL
collect2:错误:ld 返回 1 个退出状态
当我在 inmenu.h 中重新声明 char *password_login 时,此错误消失
但是随后发生分段错误,因为 login.h 中 password_login 的原始值丢失并且 password_login 指向 0x0 内存地址,我使用 strcat() 将 password_login 连接到另一个字符串。
如何在登录时保留inmenu中password_login指针的值。
这是 concatsqluppass 函数
char *concatsqluppass(char *tmppass, char *tmppassnew)
{
char *sql;
sql = (char *)calloc(MAX, sizeof(char));
strcat(sql, "update user_list set encpass = '");
strcat(sql, tmppassnew);
strcat(sql, "'");
strcat(sql, " where encpass = '");
strcat(sql, tmppass);
strcat(sql, "'");
strcat(sql, "\0");
printf("query to be passed, \"%s\"", sql);
return sql;
}
【问题讨论】:
标签: c segmentation-fault linker-errors header-files