首页 > 解决方案 > Malloc 不分配空间

问题描述

我正在尝试编写一个从文件动态读取输入的 C 程序。输入文件中的数据不在固定列中,它们用':'分隔。我正在从输入文件中读取每一行并传递给以下函数以基于“:”进行拆分,并返回一个字符串数组。定义 char **stringArray 将字符串列表返回给主程序。但是我的程序在下面的 malloc 步骤中停止,没有抛出任何错误。

有人能指出这个空间分配有什么问题吗?

char **splitString(char *inputString, char delim)
{
    int cur_size=100,i=0;
    char **stringArray;
    printf("in splitstring, input read : %s\n",inputString);
    if (NULL==(stringArray=(char **)malloc(cur_size*sizeof(char *)))){
        fprintf(stderr,"%s","Error while allocating space while split string");
    }
    printf("%s\n","in splitstring, space allocated");
    return stringArray;
}

输入文件 :

XX1701:x:11701:601:Name 1:/folder1/subfolder/subsubfolder1:/bin/bash
XX1702:x:11702:601:Name 2 Title:/folder1/subfolder/subsubfolder 2:/bin/bash
XX1703:x:11703:601:Name 3 Title 3:/folder1/subfolder/subsubfolder3:/bin/bash

程序的输出,我得到:

$ ./sortStudent
In main , input read : XX1701:x:11701:601:Name 1:/folder1/subfolder/subsubfolder1:/bin/bash
in splitstring, input read : XX1701:x:11701:601:Name 1:/folder1/subfolder/subsubfolder1:/bin/bash
$

主要的 :

int main(int argc,char *argv[])
{
    char *inputLine, **inputSplit;
    FILE *fptr;
    char *filename = "studentInput.txt";
    int allocated_size=100,i,j,rc=0;

    if (NULL == (fptr= fopen(filename,"r"))){ // Opens file in read mode and checks file open error
        fprintf(stderr,"\nError in opening file %s",filename);
        return -1;
    }

    if (NULL==(inputLine=(char *)calloc(1000,sizeof(char)))){
        fprintf(stderr,"%s\n","Error in calloc");
        return -1;
    }

    while (NULL!=fptr){
        rc=getInput(fptr, &inputLine, '\n');
        if (-1==rc){
            return -1;
        }
        if (1==rc){
            break;
        }
        printf("In main , input read : %s\n",inputLine);
        inputSplit = splitString(inputLine, ':');
        printf("In main, input split : %s %s %s\n",inputSplit[0],inputSplit[2],inputSplit[4]);
     return 0;
}

获取输入:

int getInput(FILE * filePointer, char **storeStr,char endChar)
{
    int i=0,c,cur_size=1;
    if(NULL==(*storeStr = (char *)malloc(cur_size*sizeof(char)))){
        fprintf(stderr,"%s","Error in malloc inside getInput function");
        return -1;
    }
    if (EOF==(c=fgetc(filePointer))){
        return 1;
    }
    (*storeStr)[i]=c;
    for (i=1;EOF!=(c=fgetc(filePointer)) && (c)!=endChar;i++){ // Read next character from input until end string is reached

        if ((i+1) <= cur_size){
            cur_size *=2;
            if(NULL==(*storeStr = (char *)realloc(*storeStr,cur_size))){
                fprintf(stderr,"%s","Error in realloc inside getInput function");
                return -1;
            }
        }
        (*storeStr)[i]=c;
    }

    (*((*storeStr)+i))='\0';    // Add null char to denote end of string
    return 0;
}

标签: cstringpointersmalloc

解决方案


内存分配错误通常不会在错误发生时出现,而是在稍后的某个时间出现。这就是这里发生的事情。

getInput您执行此检查以查看是否需要扩展缓冲区:

if ((i+1) <= cur_size){

如其所写,仅当当前索引小于容量而不是更大时才扩展缓冲区。因此,在第一次迭代中,您写入超过分配内存的末尾。

你反而想要:

if ((i+1) >= cur_size){

此外,您没有设置 in 的成员,stringArray因此splitString您需要添加代码来填充这些成员。


推荐阅读