c-malloc之后的while循环之后的分段错误



我正在尝试动态创建一个2d数组,然后打开一个txt文件,复制每个宽松的2d数组。然后将此数组保存回我的main。我一直遇到分段错误。有什么建议如何修复此代码吗?顺便说一句,我认为问题出现在第二次循环之后。。。

    #include<stdio.h>
    char **randomArrayofStrings(){
        char **twoArray=null;
        int rows=50;
        int col=20;
        i=0;
        FILE *file=null;
        int messageSize=50;//this is number is trivial
        file = fopen("somefile.txt","r");
        twoArray= malloc(rows*sizeof(char*));
        for(i=0;i<col;i++)
        {
             twoArray[i]=malloc(rows*sizeof(char));
             strcpy(twoArray[i], "some random word");
        }
        while(!feof(file))
        {
             fgets(dArray[i],messageSize, file);
             strtok(dArray[i], "n");
             i++;
        }   
        return twoArray;
    }

    int main(int argc, char **argv)
    {
        char **localArray=null;
        localArray=randomArrayofStrings();
        for(i=0;i<20;i++)//20 is just a random number
             printf("Strings: %s", localArray[i]);
    }

如我所见,在函数randomArrayofStrings中,循环for遍历代码中的列"I cols"。因此,您首先分配指针数组并将其视为cols,然后在循环中分配rows

malloc之后,检查返回的值,如果在内存分配后指针为NULL,则不要使用指针。

要释放已分配的内存,请使用反向序列-在循环中释放所有rows,而不是释放一次cols。例如:

        for(i=0;i<col;i++){
            free(twoArray[i]);
        }
        free(twoArray);
        twoArray = NULL;

编辑:

此外,要使用mallocfree,需要#include <stdlib.h>#include <string.h>用于strcopyint i=0;应该代替i=0;,指针的正确空值为NULL

什么是dArray?我看不到声明或定义?你是说twoArray吗?

第2版:

以下是我的程序版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **randomArrayofStrings(){
    char **twoArray=NULL;
    char * ptr = NULL;
    int rows=50; // this will be also message size
    int cols=20;
    int i=0;
    FILE *file=NULL;
    file = fopen("somefile.txt","r");
    if( file == NULL )
        return NULL;
    twoArray = (char**) malloc(cols * sizeof(char*));
    if(twoArray == NULL)
    {
        return NULL;
    }
    for(i=0;i<cols;i++)
    {
        twoArray[i] = (char*)malloc(rows*sizeof(char));
        if(twoArray[i] == NULL)
            return NULL;
        strcpy(twoArray[i], "some random word");
    }
    i = 0; // reset counter
    while(!feof(file))
    {
        fgets(twoArray[i], rows, file);
        ptr = strchr(twoArray[i],'n');
        if( ptr )
            *ptr = '';
        else
            twoArray[i][rows-1] = '';
        i++;
        if( i >= cols)
            break;
    }   
    fclose(file);
    return twoArray;
}
void freeMy2dArray(char **twoArray, int n)
{
    int i;
    for(i=0; i < n; i++){
         free(twoArray[i]);
    }
    free(twoArray);
    twoArray = NULL;
}

int main(int argc, char **argv)
{
    int i;
    char **localArray=NULL;
    localArray = randomArrayofStrings();
    if( localArray == NULL )
        return 1;
    for(i=0;i<20;i++)//20 is just a random number
        printf("Strings: %sn", localArray[i]);
    freeMy2dArray(localArray, 20);
}

您在randomArrayofStrings()中不被假定为free() twoArray。一旦你用完了分配的纪念物,你就必须在main()中释放它们。

也就是说,在main()中使用sizeof(localArray)的方式是错误的。您必须使用您在填充twoArray时使用的确切值。

相关内容

  • 没有找到相关文章

最新更新