c - 为什么在一切都正确完成后我会在应用程序结束时出现段错误?

标签 c segmentation-fault

#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;
}

这个程序运行良好,但有一个问题 - 如果密码正确,那么它确实会打印“这里有一些东西...”,但它最后也会显示段错误。为什么?

最佳答案

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

关于c - 为什么在一切都正确完成后我会在应用程序结束时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2566388/

相关文章:

c - 使用 Streaming Simd Extensions (SSE) 的按位运算

c - 如何在 openGL 中使用 glTranslatef、glScalef、glRotatef

c - 在我的内核驱动程序中是 "reinterpret_cast"未定义

c - char* 的 printf 出现段错误

c - 写的字符比 malloced 多。为什么它不会失败?

C++11:带有 std::thread 和 lambda 函数的段错误

c - 需要明确 OpenCV 中 cvCaptureFromFile 的用法

c - 如何将字符串转换为 int 或 float 类型?

使用 vector 初始化链表时出现c++段错误

c - 使用 sscanf 给 int 指针赋值后,指针在 printf 中触发段错误