C语言中的分配问题和奇怪行为
嘿! 我对这段代码有一些问题,因为它在我的笔记本电脑(win 10)上工作,但当我在旧电脑(win 7)上尝试时,每次都会崩溃。此外,有时,如果我有更多的文件,它无法重新分配内存,但不仅如此(例如,它可以处理12个文件,但在第13个文件时,它崩溃)。 现在这是修改后的代码,它在Win7上正常工作,但在Win10上不正常,问题好像颠倒了过来C语言中的分配问题和奇怪行为,c,out-of-memory,allocation,C,Out Of Memory,Allocation,嘿! 我对这段代码有一些问题,因为它在我的笔记本电脑(win 10)上工作,但当我在旧电脑(win 7)上尝试时,每次都会崩溃。此外,有时,如果我有更多的文件,它无法重新分配内存,但不仅如此(例如,它可以处理12个文件,但在第13个文件时,它崩溃)。 现在这是修改后的代码,它在Win7上正常工作,但在Win10上不正常,问题好像颠倒了过来 #include <stdio.h> #include <stdlib.h> #include <string.h> i
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *f, *fc;
float lg, lt;
int q, l, i, n;
char lgs[20], lts[20], qs[5], *s, *t, *sir2="</parts></data>", *sir1="<?
xml version=\"1.0\"?><data><parts>";
char *ch, sl[100], numeI[20], numeO[20], *sir="text with 3 space pattern",
*sir3="some long text";
printf("INTRODU NUMARUL DE FISIERE: ");
scanf("%d", &n);
for(i=0; i<n; i++)
{
if(i<10) sprintf(numeI, "0000000%d.###", i);
else sprintf(numeI, "000000%d.###", i);
f=fopen(numeI, "r");
if(f==NULL)
{
perror("Eroare deschidere fisier");
return(1);
}
sprintf(numeO, "optimizare%d.xml", i);
fc=fopen(numeO, "w");
if(fc==NULL)
{
perror("Eroare deschidere fisier");
return(1);
}
l=strlen(sir)+strlen(sir3);
s=(char*) malloc((strlen(sir1)+l+1));
strcpy(s, sir1);
fgets(sl, 100, f);
while(fgets(sl, 100, f))
{
strcat(s, sir);
sscanf(sl, "%f %f %d", &lg, <, &q);
lg=lg*10;
lt=lt*10;
sprintf(lgs, "%.2f", lg);
sprintf(lts, "%.2f", lt);
sprintf(qs, "%d", q);
ch=strstr(s, " ");
if(ch==NULL)
{
perror("EROARE CH 1");
}
strncpy(ch, lgs, strlen(lgs));
ch=strstr(s, " ");
if(ch==NULL)
{
perror("EROARE CH 2");
}
strncpy(ch, lts, strlen(lts));
ch=strstr(s, " ");
if(ch==NULL)
{
perror("EROARE CH 3");
}
strncpy(ch, qs, strlen(qs));
t=(char*) realloc(s, (strlen(s)+l+25));
if(t==NULL) {
perror("\nEROARE REALOCARE");
return 1;
}
s=t;
strcat(s, sir3);
}
t=(char*) realloc(s, (strlen(s)+strlen(sir2)));
if(t==NULL) {
perror("\nEROARE REALOCARE 2");
return 1;
}
s=t;
strcat(s, sir2);
fprintf(fc, s);
fclose(f);
fclose(fc);
}
printf("CONVERTIRE EFECTUATA");
#包括
#包括
#包括
int main()
{
文件*f,*fc;
浮子lg,lt;
int q,l,i,n;
字符lgs[20],lts[20],qs[5],*s,*t,*sir2=“”,*sir1=“”;
char*ch,sl[100],numeI[20],numeO[20],*sir=“文本带3个空格模式”,
*sir3=“一些长文本”;
printf(“introa NUMARUL DE FISIERE:”);
scanf(“%d”和“&n”);
对于(i=0;i我很惊讶这在任何平台上都能起作用
看看这两行:
ch=strstr(s, " ");
strncpy(ch, lgs, strlen(lgs));
因此,您可以在字符串s
中搜索”
,并(不检查NULL)简单地将其他字符串复制到该位置
但是如果s
不包含“
模式,ch
将为空,程序将在复制操作时崩溃
那么s
是否包含该模式
我不这么认为
s
第一次是如何构造的
strcpy(s, sir1); // Copy of sir1
fgets(sl, 100, f);
while(fgets(sl, 100, f))
{
strcat(s, sir); // Append of sir
由于sir1
和sir
不包含模式,因此s
和ch
也将为空
建议
ch = strstr(s, " ");
if (ch == NULL)
{
// Add error handling here
}
strncpy(ch, lgs, strlen(lgs));
始终检查返回值
示例
ch = strstr(s, " ");
if (ch == NULL)
{
// Add error handling here
}
strncpy(ch, lgs, strlen(lgs));
这也适用于所有其他库调用(例如,malloc
)是否尝试调试失败的库函数?首先检查库函数的返回值。这非常棘手。调试时,它适用于所有文件(例如13个文件),但如果不是,它只适用于前10个文件,然后我得到重新分配错误:空间不足。为了便于阅读和理解:1)单独的代码块:用于
如果
其他
当
执行时…当
通过一个空行切换
案例
默认值时。2)遵循公理:每行只有一条语句,并且(最多)每个语句一个变量声明。3)一致地缩进代码。在每个开始大括号“{.Unindent在每个结束大括号“}”之后缩进。建议在调用任何堆分配函数时,每个缩进级别为4空格:malloc
calloc
realloc
:1)始终选中(!=NULL)确保操作成功的返回值。2)调用realloc
时,始终将返回值分配给“temp”变量,测试该变量是否成功,并且仅当成功时,才将该值分配给目标指针。否则,当调用realloc
失败时,原始指针将覆盖NULL值,导致不可恢复的内存泄漏模式位于sir1中,但文本太长,无法将其放在此处。@Robert这就是为什么为了调试帮助,要求您创建一个I Check now为ch返回的值,但没有任何错误。因此,我成功地使其工作。我将sir1中的长文本拆分为两个字符串,一个带有模式和另一个和剩下的文本,我在最后通过strcat加入到s中。谢谢你的关注!或者不…它在win 7上有效,但在win 10上无效。它说它没有足够的空间重新分配。。