0

我正在做一个简单的项目,但我遇到了一个错误。我在 Unix 中编码并使用终端执行代码。

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int atis;
    char *weather;

    //Création du fichier ATIS
    if((atis = creat("atis", 0666)) == -1)
    {
        printf("Error while creating the ATIS file\n");
        exit(-1);
    }

    //Ouverture du fichier ATIS
    if((atis = open("atis", 0666)) == -1)
    {
        printf("Permission denied\n");
        exit(-1);
    }

    //Mise à jour du fichier ATIS
    printf("OK or KO for a take-off? ");
    gets(weather);
    if(write(atis, weather, sizeof(weather))==-1)
    {
        printf("Write error\n");
        exit(-1);
    }


    close(atis);
    return 0;
}**

错误是分段错误 11。

先感谢您!(对不起我的英语,真的很糟糕^^)

4

5 回答 5

5

weatherchar*在以下调用中首次使用时是一个未初始化的:

gets(weather);

这意味着gets()将尝试写入不应该写入的内存,从而导致分段错误。为数组分配内存weather或使用数组:

char weather[128];

在随后的调用中write()使用strlen(weather)而不是sizeof(weather)仅写入读取的字符(并正确处理weatheris achar*而不是 a的情况char[])。

此外,请参阅为什么获取函数如此危险以至于不应该使用它?. 使用fgets()或可能scanf()与长度说明符一起使用。

于 2013-01-15T14:56:38.257 回答
2

您永远不会为指针分配任何内存:char *weather;

手册页

char *gets(char *s);
get() 从标准输入读取一行到 s 指向的缓冲区,直到终止换行符或 EOF,

因此,您需要一个缓冲区将其存储到:

char weather[10];

或者

char *weather;
weather = malloc(10);

如果 10 就足够了。这又从手册页引出了另一点:

永远不要使用gets()。因为在事先不知道数据的情况下不可能知道gets()会读取多少个字符,而且因为gets()会继续存储超过缓冲区末尾的字符,所以使用起来非常危险。它已被用来破坏计算机安全。请改用 fgets()。

前任:

fgets (weather, 10 , stdin);
于 2013-01-15T14:57:00.720 回答
2

问题是这两行:

char *weather;

gets(weather);

第一个声明weather为指针,但未初始化(即指向看似随机的位置)。第二行写入指向的内容weather,这意味着您写入某个随机位置。

声明weather为数组,并fgets改为使用:

char weather[64];

/* ... */

fgets(weather, sizeof(weather), stdin);
于 2013-01-15T14:57:52.163 回答
0

您确实在未指向已分配内存的指针上获取(天气)。

于 2013-01-15T14:58:37.893 回答
0
char *weather;

进而

gets(weather);

导致分段错误。weather应该指向一个内存空间:

  • 静态的

    char weather[100]

  • 或动态

    char *weather = malloc(100*sizeof(char));

于 2013-01-15T14:58:53.760 回答