带文件输入的 C 内存分配

C memory allocation with File input

你好,内存分配有问题,

    1.打开文件
    2.取里面的文字长度
    3. 使缓冲区的长度为 (array[] ? malloc ?)
    4. 对缓冲区中的文本进行操作。
    5.关闭

当文本超过 1xx 个字符时它会终止我不知道发生了什么。
ps.注意!我的学习和这段代码的质量可能很差

#include <stdio.h>
#include <stdlib.h>

void copy_to_buffer(FILE *fp, int length, char *buffer){
    for(int i = 0; i < length; i++){
        char c = fgetc(fp);
        buffer[i] = c;
    }
}
int length_of_text(FILE *fp) {
    fseek(fp, 0L, SEEK_END);
    int size = ftell(fp);
    rewind(fp);
    return size;
}

void char_counter(int length, char *buffer, int *charBuffer) {
    int counts[128] = { 0 };
    for (int i = 0; i < length; i++) {
        counts[(int)(buffer[i])]++;
        charBuffer[i] = counts[i];
    }
    for (int i = 0; i < 128; i++) {
        charBuffer[i] = counts[i];
        if(counts[i] != 0)
            printf("%d.(%c) counted: %d times.\n", i,i, counts[i]);
    }
}
/***********************************MAIN***********************************/
int main(int argc, char** argv) {

    FILE *fp = fopen("tekst.txt" , "r");
    int length = length_of_text(fp);                //lenght of text
    char *buffer = malloc(sizeof(char)*length);     //buffer for text from file
    if(buffer == NULL) 
        printf("error");
    else
        printf("alocated at = %p\n", &buffer);

    int charBuffer[128] = {0}; // charcount buffer
    buffer[length] = '[=10=]';   // '[=10=]' after last sign
    copy_to_buffer(fp, length, buffer); 
    char_counter(length, buffer, charBuffer); 

    free(buffer);
    fclose(fp);     
    return 0;
}

在这一行

charBuffer[i] = counts[i];

当文件大小 >= 128 时,您将溢出 charBuffer[128],因为 i 正在索引文件的长度。

在你的char_counter函数中你做

charBuffer[i] = counts[i];

在第一个 for 循环中,但缓冲区仅定义为 128 个整数。如果文本超过 128 个字符,这将导致缓冲区溢出和分段错误。

删除该行并让第二个 for 循环完成。