C语言中的分配问题和奇怪行为

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

嘿! 我对这段代码有一些问题,因为它在我的笔记本电脑(win 10)上工作,但当我在旧电脑(win 7)上尝试时,每次都会崩溃。此外,有时,如果我有更多的文件,它无法重新分配内存,但不仅如此(例如,它可以处理12个文件,但在第13个文件时,它崩溃)。 现在这是修改后的代码,它在Win7上正常工作,但在Win10上不正常,问题好像颠倒了过来

#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, &lt, &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上无效。它说它没有足够的空间重新分配。。