使用C语言时的分割错误

使用C语言时的分割错误,c,segmentation-fault,C,Segmentation Fault,可能重复: 我试图运行一个C程序,在这个程序中,我接受用户的密码,然后输出它。然而,当我运行该程序时,我得到一条消息,称为Segmentation Fault core dumped。我知道这个错误发生在数组似乎超过堆栈大小的地方,但我无法找出我错在哪里。感谢您的帮助。代码如下: int main(int argc, char *argv[]) { int i = 0; char *password, *key; int keylength = 256; print

可能重复:

我试图运行一个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;
}

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

通过1将密码声明为堆栈数组为密码分配内存:

char password[1024];
或2,使用malloc分配内存缓冲区:

如果您使用malloc,请记住,使用malloc分配的任何内容都必须通过相应的free调用来解除分配

另外,在您发布的代码中,当您将缓冲区传递给scanf时,当您说&password时,您正在获取指针本身的地址。您只需传递指针,该指针是指分配的缓冲区的内存地址,如:

scanf(" %[^\n]", password);
请注意,密码前没有(&F)。您不需要它,因为密码是指针。放置&before密码意味着您正在将指针传递给一个指针,而这不是您想要的。
最后,请注意,在用C编程时,缓冲区溢出是一种持续的危险。scanf不会阻止程序用户输入超出缓冲区容量的数据。如果发生这种情况,将发生缓冲区溢出,程序将显示未定义的行为,并可能崩溃。有更安全的方法从用户获取字符串输入,例如。

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

通过1将密码声明为堆栈数组为密码分配内存:

char password[1024];
或2,使用malloc分配内存缓冲区:

如果您使用malloc,请记住,使用malloc分配的任何内容都必须通过相应的free调用来解除分配

另外,在您发布的代码中,当您将缓冲区传递给scanf时,当您说&password时,您正在获取指针本身的地址。您只需传递指针,该指针是指分配的缓冲区的内存地址,如:

scanf(" %[^\n]", password);
请注意,密码前没有(&F)。您不需要它,因为密码是指针。放置&before密码意味着您正在将指针传递给一个指针,而这不是您想要的。 最后,请注意,在用C编程时,缓冲区溢出是一种持续的危险。scanf不会阻止程序用户输入超出缓冲区容量的数据。如果发生这种情况,将发生缓冲区溢出,程序将显示未定义的行为,并可能崩溃。有更安全的方法从用户获取字符串输入,例如。

密码是一个统一的指针。他拿不住任何绳子。尝试写入此变量会导致未定义的行为。以下是两种解决方案:

char password[SIZE];

/* or */

char *password = malloc(size);
密码是一个统一的指针。他拿不住任何绳子。尝试写入此变量会导致未定义的行为。以下是两种解决方案:

char password[SIZE];

/* or */

char *password = malloc(size);

您已经创建了指针密码,但从未初始化它


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

您已经创建了指针密码,但从未初始化它


这意味着指针包含一个随机值,不管在本例中堆栈上发生了什么。当您取消引用指针时,您正试图访问该随机地址的内存。这永远不会是您想要的,而且很可能会导致诸如分段错误之类的问题。

我喜欢这个。也许你可以写下我们遇到的问题,密码是固定长度的,程序用户可能输入任意数量的字节?我知道这是一个初学者的问题。这就是为什么你提到它很重要我喜欢这个。也许你可以写下我们遇到的问题,密码是固定长度的,程序用户可能输入任意数量的字节?我知道这是一个初学者的问题。这就是为什么你提到它很重要