如何将数组存储在MD数组中,并从函数返回该数组?

时间:2018-05-16 22:12:52

标签: c arrays pointers character

我有一个方法,它接收文件列表,并获取有关文件的数据。这些文件的格式作为两个1D数组返回。我想将它们组合成一个2D数组。

文件只返回一个类型数组和一个数据数组。

这是有问题的方法。我成功地从文件和1D数组中获取了我需要的数据,但是当我尝试将它们添加到2D数组时,它会运行(但会发出警告:char *和char * [] []不等同于)。

char *ParseFiles(char *listOfFiles[32])
{
    char *allFileData;
    char *tmpArray[32][32];

    allFileData = tmpArray;

    for(int i = 0; i < listOfFiles[i]; i++)
    {
        int j = 0;
        // Get the File Type
        char *currentFileType = GetFileType(listOfFiles[i], strlen(listOfFiles[i]));

        if(currentFileType)
        {
            // Warning char * and char *[][] are not equivalent.
            tmpArray[i][j] = currentFileType;
            printf("File %d is %s\n", i, currentFileType);
            //printf("File %d is %s\n", i, &tmpArray[i][j]);
            //free(currentFileType);
        }

        //Get all File Data
        // Warning char * and char *[][] are not equivalent.
        char *currentFileData = GetFileData(listOfFiles[i]);

        j = j + 1;
        if(currentFileData)
        {
            tmpArray[i][j] = currentFileData;
            printf("File Data:\n%s\n", currentFileData);
            //free(currentFileType);
        }
    }
    return allFileData;
}

当我尝试在注释掉的printf语句中输出tmpArray[][]值时,我会得到意外的字符(对于犯错误的人来说意外)?]p

问题是基于两个char数组的警告不是同一类型,还是因为我试图将单维数组错误地插入多维数组?

我得到的确切警告是warning: incompatible pointer types assigning to 'char*' from 'char *[32][32]'

以下是我的另外两种方法,主要是:

char *GetFileType(char *filePath, int size)
{
    char *ret = malloc(size);

    char currentLine[100];
    FILE *file = fopen(filePath, "r");

    while(fgets(currentLine, sizeof(currentLine), file) != NULL)
    {
        if(strstr(currentLine, "test"))
        {
            ret = "test";
        }

        else if(strstr(currentLine, "production"))
        {
            ret = "production";
        }
    }
    if(!ret)
    {
        return NULL;
    }
    return ret;

}

char *GetFileData(char *filePath)
{

    char *buffer = NULL;
    size_t size = 0;

    FILE *file = fopen(filePath, "r");

    // Get the buffer size
    fseek(file, 0, SEEK_END);
    size = ftell(file);

    // Reset the position of the stream
    rewind(file);

    buffer = malloc((size + 1) * sizeof(*buffer));

    // Read the entire file into the buffer
    fread(buffer, size, 1, file);

    buffer[size] = '\0';

    return buffer;
}

int main (void)
{
    char *listOfFiles[32] = {"file1.txt", "file2.txt", "file3.txt"};

    ParseFiles(listOfFiles);

    printf("Press ENTER key to Continue");
    getchar();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题不是你说的,而是在这里:

char *allFileData;
char *tmpArray[32][32];

allFileData = tmpArray;

tmpArray的类型为char *[32][32]allFileData的类型为char *。作业无效。

还有更糟糕的事情发生了:你返回allFileData指向本地变量 tmpArray。一旦函数返回,变量tmpArray将超出范围,并且您返回的指针将立即变为无效。将数组作为参数传递,或者在函数内动态分配。