The*_*ner 1 c segmentation-fault
可能重复:
使用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;
}
Run Code Online (Sandbox Code Playgroud)
你没有分配任何内存password.它只是一个未初始化的指针.在C中,您始终需要确保指针在使用之前指向有效的已分配内存缓冲区.使用未初始化的指针会导致未定义的行为,这通常会导致崩溃.
password通过(1)声明password为堆栈数组来分配内存:
char password[1024];
Run Code Online (Sandbox Code Playgroud)
或(2),使用malloc以下方法分配内存缓冲区:
char *password = malloc(1024);
Run Code Online (Sandbox Code Playgroud)
如果您使用malloc,请记住您分配的任何内容malloc必须通过相应的调用取消分配free.
此外,在您发布的代码中,当您将缓冲区传递给时scanf,当您说时,您将获取指针本身的地址&password.你想要做的只是传递指针(这是一个指向你分配的缓冲区的内存地址),如:
scanf(" %[^\n]", password);
Run Code Online (Sandbox Code Playgroud)
请注意,没有出现&之前password.你不需要它,因为它password是一个指针.放置&之前password意味着您正在向指针传递指针,这不是您想要的.
最后,请注意,在C语言编程时,缓冲区溢出是一个持续的危险. scanf没有做任何事情来阻止程序的用户输入超过缓冲区的数据.如果发生这种情况,则会发生缓冲区溢出,并且程序将显示未定义的行为(并且可能会崩溃).有更安全的方法可以从用户那里获取字符串输入,例如fgets.
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |