1

可能重复:
使用 scanf 的分段错误

我正在尝试运行一个 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;
}
4

3 回答 3

7

您没有为password. 它只是一个未初始化的指针。在 C 语言中,您始终需要确保您的指针在使用它们之前指向有效分配的内存缓冲区。使用未初始化的指针会导致未定义的行为,这通常会导致崩溃。

password通过 (1) 声明password为堆栈数组来分配内存:

char password[1024];

或 (2),使用分配内存缓冲区malloc

char *password = malloc(1024);

如果您使用malloc,请记住,您分配的任何东西都malloc必须通过相应的调用来释放free

此外,在您发布的代码中,当您将缓冲区传递给 时,当您说 时scanf,您正在获取指针本身的地址&password。您想要做的只是传递指针(这是一个引用您分配的缓冲区的内存地址),例如:

scanf(" %[^\n]", password);

注意没有&before password。你不需要它,因为它password是一个指针。放置&beforepassword意味着您将指针传递给指针,这不是您想要的。

最后,请注意,在使用 C 编程时,缓冲区溢出是一种持续的危险scanf不会做任何事情来阻止程序的用户输入超出缓冲区容量的数据。如果发生这种情况,则会发生缓冲区溢出,并且您的程序将表现出未定义的行为(并且可能会崩溃)。有一些更安全的方法可以从用户那里获取字符串输入,例如fgets.

于 2013-01-24T17:38:49.343 回答
2

password是一个未初始化的指针。他不能握住任何绳子。尝试写入此变量会导致未定义的行为。这里有两个解决方案:

char password[SIZE];

/* or */

char *password = malloc(size);
于 2013-01-24T17:38:57.973 回答
1

您已经创建了指针password,但您从未对其进行初始化。

这意味着指针包含一个随机值,在这种情况下,无论堆栈中发生了什么。当您取消引用指针时,您正在尝试访问该随机地址处的内存。这永远不会是你想要的,并且很可能会导致诸如分段错误之类的问题。

于 2013-01-24T17:39:17.047 回答