太多打开的文件c

时间:2014-07-09 13:45:16

标签: c file

我一直在尝试创建一个简单的程序。但是,我遇到了一个错误:

  

gmon.out:打开的文件太多

我不清楚为什么它说“我有太多的打开文件”。我似乎没有使用文件。

#include<stdio.h>
#include<ctype.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

struct position
{
    int line;
    int place;
    struct position *next;
};
struct file
{
    struct position *info;
    struct file *next;
    char *name;
};
struct word
{
    char *name;
    struct word *right;
    struct word *left;
    struct file *result;
};

int main()
{
    int i;
    struct word *d,*c;
    char *s="brutus";
    printf("%s",s);
    c=(struct word*)malloc(sizeof(struct word));
    strcpy(c->name,s);
    c->left=NULL;
    c->right=NULL;
    for(i=1;i<=10;i++)
    {
        d=(struct word*)malloc(sizeof(struct word));
        if(d==NULL)
            exit(0);

        scanf("%s",s);
        printf("4");
        s=d->name;

        printf("%s",d->name);

        d->left=NULL;
        d->right=NULL;
    }
    system("pause");
    exit(0);
}

我该怎么办?感谢您的时间!

4 个答案:

答案 0 :(得分:2)

首先关闭:

  

gmon.out:打开的文件太多

表示您正在使用-p标志进行编译(分析)。 gmon.out是gprof使用的默认文件名。只是开沟了,你再也不会遇到这个问题了 当然,不分析代码并不是很好,但在开始实际分析代码之前,你最好先解决一些问题。

其中一些问题很多:

char *s="brutus";
printf("%s",s);
c=(struct word*)malloc(sizeof(struct word));
strcpy(c->name,s);

问题清单:

  • char *s应为const char *s,因为它指向只读内存。
  • 接下来,Do not cast the return of malloc
  • 检查malloc等函数的返回值,它们会告诉您一些事情
  • struct word是一个结构,所有成员都是指针。分配结构后,这些指针无效:您还需要为这些成员分配内存
  • strcpy期望目标(c->name)成为有效指针,如上所述:这不是这里的情况

那么,这段代码应该是什么样的:

const char *s = "brutus";
c = malloc(sizeof *c);
if (c == NULL)
{
    fprintf(stderr, "Could not allocate memory for struct word\n");
    exit( EXIT_FAILURE );
}
//allocate enough memory to store the string
c->name = malloc(
    (strlen(s)+1) * sizeof *c->name
);
//OR same, but shorter, works because the type char is guaranteed by the standard to be 1 byte in size
c->name = malloc(strlen(s)+1);
if (c->name == NULL)
    exit( EXIT_FAILURE );//could not allocate mem
c->name[0] = '\0';//set to empty string, now we can use safer functions:
strncat(c->name, s, strlen(s));

在您解决这些问题后,请认真重新考虑您的方法,并问问自己,您实际上是在尝试做什么:

for(i=1;i<=10;i++)
{
    d=(struct word*)malloc(sizeof(struct word));
    if(d==NULL)
        exit(0);

    scanf("%s",s);
    printf("4");
    s=d->name;
}

您每次重新分配一个结构10次,每次重新分配给d。但是你永远不会释放这种记忆。这是不好的做法 再说一次:不要归还malloc 的回报,但这是你最不担心的事情。

if (d == NULL)
    exit(0);

好的,现在检查malloc的返回。大。但是,为什么你要终止 0 (表示成功运行)。这也是一个宏。你可以写:

if (d == NULL)
    exit( EXIT_SUCCESS);

显然,EXIT_SUCCESS不是您应该沟通的内容 const char *s现在用于存储用户输入。但是,这不会起作用,因为它指向只读内存,所以忘记不安全的scanf("%s", s);语句。使用堆栈变量,并确保清除输入缓冲区,或使用安全的替代方案 但是,你去做一些荒谬的事情:

s = d->name;

同样,d->namec的情况一样,是无效指针。为什么要将其分配给s?没有意义,没有理由......只有疯狂。

底线:在孵化之前杀死此代码,重新开始,请使用这些提示/建议和批评作为指导。

答案 1 :(得分:0)

我不知道为什么你会得到'太多的打开文件',但这一行:

strcpy(c->name,s)

正在将数据写入随机存储器,这可能会导致各种问题。 您需要首先使用c-&gt;名称的malloc()。

此外,scanf到s看起来很可疑,d-&gt;名称也从未被分配任何内容。

你得到“太多打开文件”的原因可能是因为某些内存被覆盖的方式恰好会触发该特定错误。欢迎来到未定义行为的世界。 IE:如果你覆盖随机内存,基本上任何可能会发生。

答案 2 :(得分:0)

第一个错误就在

    strcpy(c->name,s);

此时,c-&gt; name是一个未初始化的指针,因此如果你幸运,程序将崩溃。

阅读你的评论:你修复了第二个错误。第一个bug仍未修复。还有行中的第三个错误

    s=d->name;

答案 3 :(得分:0)

此字符串副本将通过内存运行,从c-&gt;名称指向的地方开始,直到找到空终止符。

的strcpy(C-&GT;名称,S);

您已为c分配空间,但未为c中的名称指针分配空间。

c-&gt; name = malloc([some length]);

c-&gt;在某个地方命名点,但你不知道在哪里使用它。这就是为什么你得到一个看似随机的错误的原因,因为你从一个未知位置执行一个字符串拷贝的未知字节数,而你正在破坏任何指向未知字节数的点。