我正在尝试运行一个C程序,其中我接受来自用户的密码然后输出它。但是,当我运行程序时,我收到一条名为“Segmentation Fault(core dumped)”的消息。我知道这个错误发生在数组似乎超过堆栈大小但我无法弄清楚我错在哪里。任何帮助表示赞赏。代码如下:
int main(int argc, char *argv[])
{
int i = 0;
char *password, *key;
int keylength = 256;
printf("\nPlease enter a password: ");
scanf(" %[^\n]", &password);
printf("Entered password is: %s", password);
return 0;
}
答案 0 :(得分:7)
您没有为password
分配任何内存。它只是一个未初始化的指针。在C中,总是需要确保指针在使用之前指向有效的已分配内存缓冲区。使用未初始化的指针会导致未定义的行为,这通常会导致崩溃。
通过(1)将password
声明为堆栈数组来为password
分配内存:
char password[1024];
或(2),使用malloc
分配内存缓冲区:
char *password = malloc(1024);
如果您使用malloc
,请记住,您使用malloc
分配的任何内容都必须通过对free
的相应调用取消分配。
此外,在您发布的代码中,当您将缓冲区传递给scanf
时,当您说&password
时,您将获取指针本身的地址。你想要做的只是传递指针(这是一个指向你分配的缓冲区的内存地址),如:
scanf(" %[^\n]", password);
请注意&
之前没有password
。你不需要它,因为password
是一个指针。在&
之前放置password
意味着您将指针传递给指针,这不是您想要的。
最后,请注意,在C语言编程时,缓冲区溢出是常量危险。 scanf
没有做任何事情来阻止程序用户输入的数据多于缓冲区中的数据。如果发生这种情况,则会发生缓冲区溢出,并且程序将显示未定义的行为(并且可能会崩溃)。有更安全的方法可以从用户那里获取字符串输入,例如fgets
。
答案 1 :(得分:2)
password
是一个未初始化的指针。他不能拿任何绳子。尝试写入此变量会导致未定义的行为。这有两个解决方案:
char password[SIZE];
/* or */
char *password = malloc(size);
答案 2 :(得分:1)
您已创建指针password
,但您从未初始化它。
这意味着指针包含一个随机值,无论在这种情况下发生在堆栈上的是什么。取消引用指针时,您试图访问该随机地址的内存。这永远不会是您想要的,并且很可能导致诸如分段错误之类的问题。