我一直在尝试创建一个简单的程序。但是,我遇到了一个错误:
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);
}
我该怎么办?感谢您的时间!
答案 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
,因为它指向只读内存。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->name
与c
的情况一样,是无效指针。为什么要将其分配给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;在某个地方命名点,但你不知道在哪里使用它。这就是为什么你得到一个看似随机的错误的原因,因为你从一个未知位置执行一个字符串拷贝的未知字节数,而你正在破坏任何指向未知字节数的点。