gpt4 book ai didi

c - 打开的文件太多 c

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:57 25 4
gpt4 key购买 nike

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

gmon.out:too many open files

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

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

我该怎么办?提前感谢您的宝贵时间!

最佳答案

首先:

gmon.out:too many open files

意味着您正在使用 -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呢?没有意义,没有理由……只有疯狂。

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

关于c - 打开的文件太多 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com