【问题标题】:C memory allocation with File input带有文件输入的 C 内存分配
【发布时间】:2016-04-27 11:06:30
【问题描述】:

您好,我的内存分配有问题,

    1.打开文件
    2. 把里面的文字拉长
    3.制作长度大小的缓冲区(数组[]?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] = '\0';   // '\0' after last sign
    copy_to_buffer(fp, length, buffer); 
    char_counter(length, buffer, charBuffer); 

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

【问题讨论】:

  • 旁白:printf("alocated at = %p\n", &amp;buffer); --> printf("alocated at = %p\n", (void*)buffer);
  • 其中一个问题在于这一行 - counts [ (int)(buffer[i]) ]++ 当您将 char 转换为 int 时,它会为您提供 ascii 表示,而不是您看到的被转换为数字的实际 char。
  • buffer[length] = '\0'; 越界。
  • tekst.txt是7位码吗?
  • @ShadyProgrammer:我猜这就是这个程序的目的。 (当文本文件包含纯 ASCII 范围之外的字符时,我预见到巨大的问题。也许这不是问题,但又可能是。)

标签: c memory malloc calloc


【解决方案1】:

在这一行

charBuffer[i] = counts[i];

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

【讨论】:

    【解决方案2】:

    在你的 char_counter 函数中你做

    charBuffer[i] = counts[i];
    

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

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

    【讨论】:

    • 我的错我没看到
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多