有没有一种方法来读取一个文本文件并将其保存在一个在C动态字符数组,试试吧befor并获得“的malloc():内存破坏”

问题描述 投票:0回答:2

我编程一个C程序应该读具有不同尺寸TEXTFILES,并保存到char *sending_data。之后,它应该char *sending_data的内容复制到char *data和打印我*data的大小。

我已经有代码来读取文件并将其保存到char *sending_data。如果我尝试将内容复制到另一个char *,我得到malloc(): memory corruption error.

如果我尝试打印sending_datadata的大小,我得到的Memory access error.

char * readFile(char *path) {
    FILE *fp;
    char *data = NULL;

    if ((fp = fopen(path, "rb")) == NULL) {
        printf("Fehler!! / Datei konnte nicht gelesen werrden \n\n");
        return data;
    } else if (fseek(fp, 0, SEEK_END) != 0) {
        fclose(fp);
    } else {
        long size = ftell(fp);
        if (size > 0 && (data = (char *) malloc(size + 1)) != NULL) {
            fseek(fp, 0, SEEK_SET);
            if (fread(data, 1, size, fp) != (size_t) size) {
                free(data);
                data = NULL;
            } else {
                data[size] = '\0';
            }
        }
        fclose(fp);
    }

    return data;
}

int main(int argc, char *argv[]) {
    /*uint8_t */unsigned char *data;

    int USER_SIZE = 8; // you can also use a macro

    unsigned char *data;


    char *sending_data;
    sending_data =(char*)malloc ( USER_SIZE* sizeof (char));

    sending_data =readFile("../PayloadFiles/ToDo.txt");

    printf(sending_data);
    printf(strlen(sending_data));

    data = (char*)malloc( USER_SIZE * sizeof(char));

    if(data)
        strcpy((char*)data, sending_data);

    printf(data_size);
    printf(data); 
}

我期待的内容和文件的大小,在其他char *文件的实际拷贝的内容

c memory char malloc corruption
2个回答
0
投票

您没有使用正确printf

printf(sending_data);
printf(strlen(sending_data));
...
printf(data_size);
printf(data); 

printf第一个参数是一个包含文本和格式说明,说明如何打印额外的参数格式字符串。你可以摆脱这跟sending_datadata是否有嵌入在他们没有格式说明,但传递strlen(sending_data)data_size当你有一个类型不匹配。这将调用undefined behavior,在这种情况下会导致系统崩溃。

使用格式字符串来决定如何打印参数:

char *sending_data;
// no need to malloc since you already did that in readFile
sending_data =readFile("../PayloadFiles/ToDo.txt");

printf("%s\n", sending_data);
printf("%zu\n", strlen(sending_data));

int data_size = strlen(sending_data));
data = malloc( data_size + 1);

if(data)
    strcpy((char*)data, sending_data);

printf("%d\n", data_size);
printf("%s\n", data); 

0
投票

你应该在data可变分配足够的空间。

data = (char*)malloc(strlen(sending_data)+1);

这也是检查sending_data不为空后调用readFile好主意。

你或许应该删除呼叫在主函数调用sending_data = (char*)malloc(USER...)之前readFile,因为它会导致内存泄漏(你里面readFile分配内存,并以其结果值覆盖sending_data)。

此外,这将是巨大的末尾呼吁free用于分配的内存,如果主要功能(因为它很好的做法,释放你分配什么)

© www.soinside.com 2019 - 2024. All rights reserved.