#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
        unsigned char *stole;
        unsigned char pass[] = "m4ak47";
        printf("Vnesi password: \t");
        scanf("%s", stole);
        if(strncmp(stole, pass, sizeof(pass)) != 0)
        {
                printf("wrong password!\n");
                exit(0);
        }
        else
                printf("Password correct\n");
        printf("some stuf here...\n\n");
        return 0;
}

这个程序运行得很好,但有一个问题-如果密码是正确的,那么它会打印“some stuf here…”,但它也会在最后显示分段错误。为什么?

最佳答案

unsigned char *stole;
上面的语句将stole声明为指向unsigned char的指针,并包含指向某个随机内存位置的垃圾值。
scanf("%s", stole);
上面的语句试图将一些字符串存储到由stole指向的内存中,该内存正被另一个程序使用(至少没有分配给您的程序使用)。因此,当scanf试图重写此内存时,会得到seg-fault
尝试将内存分配给stole,如下所示
unsigned char stole[MAX_SIZE];

unsigned char *stole = malloc((MAX_SIZE+1) * sizeof(char));
// +1 for null-terminating

Dynamic String Input

10-08 02:34