Realloc导致应用程序崩溃

时间:2014-08-20 19:19:57

标签: c memory crash realloc

这个问题已被多次询问,但我已完成(据我所知)这里提到的所有内容。基本上,我从TCP套接字中一次获得1个字符,并且我用一个字符构建一个动态增长的字符串。我可以循环打印并看到字符串增长和增长,然后当它达到20个字符长时,程序崩溃。

while(FilterAmount != 0)
{
    g_io_channel_read_chars (source,(gchar *) ScanLine,1,&BytesRead,&GlibError);
    printf("Scanline: %s FilterAmount: %ld\n", ScanLine, FilterAmount); 
    //the filters are delimited by \n, munch these off, reset important variables, save the last filter which is complete 

    if(ScanLine[0] == FilterTerminator[0]) { 
        //if the Filter Name actually has a filter in it 
        if(FilterName != NULL){
            FilterArray = FilterName; //save off the filter name
            printf("This is the filter name just added: %s\n", FilterName); 
            FilterArray++; //increment the pointer to point to the next memory location. 
            FilterAmount--; //update how many filters we have left 
            FilterNameCount = 0; //reset how many characters each filter name is
            free(FilterName);
            free(FilterTmp); 
            }
        }
        else {
            printf("else!\n"); 
            //keep track of the string length of the filter
            FilterNameCount++;
            //allocate more memory in the string used to store the filter name + null terminating character
            FilterTmp = (gchar*)realloc(FilterName, FilterNameCount*sizeof(char) + 1);
            if(FilterTmp == NULL)
            {
                free(FilterName);
                printf("Error reallocating memory for the filter name temporary variable!"); 
                return 1; 
            }
            FilterName = FilterTmp; 
            printf("filter name: %s\n", FilterName); 
            //concat the character to the end of the string where space was just made for it. 
            strcat(FilterName, ScanLine);
        }
    }
}

只要我们有一个非" \ n"这段代码就会循环和循环。我们将数据读入缓冲区中的字符。每次分配第21个角色的位置时程序崩溃。以下是相关声明:

static gchar *FilterName = NULL, *FilterTmp = NULL;
static gchar ScanLine[9640];

0 个答案:

没有答案