簡體   English   中英

程序的執行停止-C(內存分配)

[英]Program's execution stops - C ( memory allocating )

我正在嘗試為USACO的回文廣場編寫解決方案。經過大量檢查,盡管我發現了很多錯誤,但仍然找不到為什么我的程序仍然要停止的原因。 我相信這是一種內存管理問題,但我不知道為什么或如此。 因此,這是代碼:

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


char ch(int x){
    if (x < 0 || x > 19) return 0;
    return "0123456789ABCDEFGHIJ"[x];
}

void append( int x, char* num){
    num=realloc(num,sizeof(char)* strlen(num)+2);
    num[strlen(num)+1] = '\0';
    num[strlen(num)] = ch(x);

}

char * baseB(int x, int base){
    int mult=1,lim=1,i;
    char *num;
    num = malloc(sizeof(char));
    num[0] = '\0';
    while(x/(mult*base)){
        mult*=base;
        lim++;
    }
    for(i=0;i<lim;i++){
        append(x/mult,num);
        x %= mult;
        mult/=base;
    }
    return num;
}

int is_pal( char* num ){
    int i;

    for(i=0;i<strlen(num)/2;i++){
        if ( num[i] != num[strlen(num)-1-i] )
            return 0;
    }
    return 1;
}
int main(){

    int x, size=0, y, base;
    int *lst;
    FILE *fp;
    lst=malloc(sizeof(int));
    fp= fopen("palsquare.in","r");
    fscanf(fp,"%d", &base);
    fclose(fp);

    for(x=1;x<301;x++){
        y = x*x;
                    printf(" a0 ");

        printf("%s ", baseB(y,base));
                    printf(" a1 ");

        //printf("%d ", is_pal( baseB(y,base) ) );
                    printf(" a2 ");

        if( is_pal( baseB(y,base) ) ){
            printf(" a3\n");
            size++;
            lst=realloc(lst,sizeof(int)*size);
            lst[size-1]=x;
        }
    }

    fp=fopen("palsquare.out","w");
    for(x=0;x<size;x++){
        fprintf(fp, "%d %d\n", lst[x], lst[x]*lst[x]);
    }
    fclose(fp);
    return 0;


}

在我看來,創建結果列表的循環是我遇到問題的原因。 關於那里發生什么的任何想法,為什么在那里發生?


編輯:

  1. 更改了開關代碼:)
  2. 釋放所有對baseB的呼叫
  3. lst不再是指針

現在, main()的代碼為:

int main(){

    int x, size=0, y, base;
    int lst[300];
    FILE *fp;
    char *tmp = NULL;
    fp= fopen("palsquare.in","r");
    fscanf(fp,"%d", &base);
    fclose(fp);

    for(x=1;x<301;x++){
        y = x*x;
        tmp=baseB(y,base);
        printf("%s ", tmp);
        if( is_pal( tmp ) ){
            size++;
            lst[size-1]=x;
        }
        free(tmp);
        tmp=NULL;
    }

    fp=fopen("palsquare.out","w");
    for(x=0;x<size;x++){
        fprintf(fp, "%d %d\n", lst[x], lst[x]*lst[x]);
    }
    fclose(fp);
    return 0;


}

最好的開始位置可能是釋放已分配的所有內存。 當然,我不知道這是否可以解決任何問題,但是...

一個問題是, baseB返回一個malloc指針,該指針隨后被傳遞到函數中,並且從不釋放。 即時泄漏。

嘗試這樣的事情:

// At the top of main
char *tmp = NULL;
// All that code until the first baseB
tmp = baseB(y, base);
printf("%s ", tmp); // Or the corresponding is_pal call
free(tmp);
tmp = NULL;

等等。

num=realloc(num,sizeof(char)* strlen(num)+2);

您修改“ num”指針的本地副本。 呼叫者功能仍將具有舊的未修改地址。 如果地址至少要更改一次-那么您就傻了。

由於代碼已經一團糟,所以最簡單的版本(最少的修改)是:

char *append( int x, char* num){
    num=realloc(num,sizeof(char)* strlen(num)+2);
    num[strlen(num)+1] = '\0';
    num[strlen(num)] = ch(x);
    return num;
}

char * baseB(int x, int base){
    int mult=1,lim=1,i;
    char *num;
    num = malloc(sizeof(char));
    num[0] = '\0';
    while(x/(mult*base)){
        mult*=base;
        lim++;
    }
    for(i=0;i<lim;i++){
        num=append(x/mult,num);
        x %= mult;
        mult/=base;
    }
    return num;
}

除此之外,正如評論所建議的那樣-調試一次! 調試器比SO更好(至少在這種情況下)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM