【问题标题】:Trouble allocating heap memory堆内存分配问题
【发布时间】:2015-04-30 19:02:44
【问题描述】:

背景:我正在尝试打开一个我更改过的文件并为其所有内容保留足够的堆内存。但是,在将所有文件的内容读入堆内存之前,我正在努力寻找程序结束的解决方案。

最佳猜测:我认为我在堆内存中没有保留足够的字节 ||我将指针转换为错误的类型(目前它是 char 类型),这可能对保留堆内存的方式和数量产生了不利影响。

FILE *fptr3;

void highgest_and_lowest_Jan123(void)
{
int c;
unsigned int i = 0;
char *file;
long int size = 0;


fptr3 = fopen("/Users/sam/Desktop/Altered_AL_Weather_Station.txt", "r+");
if (fptr3 == 0)
{
    printf("There was an error creating the file.\n");
    exit(0);
}

fseek(fptr3, 0, SEEK_END);
size = ftell(fptr3);
file = (char *) malloc(size * sizeof(char));
if(!file)
{
    puts("Not enough memory");
    exit(1);
}

fseek(fptr3, 0, SEEK_SET);

do
{
    c = fgetc(fptr3);
    if ((int)c == EOF)
        break;
    file[i] = c;
    printf("%c", file[i]);
    i++;
} while((int)c != EOF);

// pus memory back on the heap
free(file);

}

这是我当前的输出:

但是,我的输出应该是这样的:

【问题讨论】:

  • 通过程序调试时会发生什么?哪里失败了?
  • 使用int c;代替char c;fgetc的返回值是int
  • 你为什么要投射cfgetc 返回一个int,将c 声明为int
  • @user3386109 我正在使用 unix。
  • while 条件应该在i < size 上终止。尝试输出 size 并将其与您获得的输出进行比较。

标签: c memory


【解决方案1】:

EOF 在大多数系统上扩展为-1 的值。 fgetc 正在返回 int。但是您正在将其读入char 变量。现在假设您的文件包含0xFF 的值。在这种情况下,c 的字节值将是 0xFF,当转换为 int 时将变为 0xFFFFFFFF,这是 int -1 值的表示。然后将其与EOF 进行比较,比较结果为真,从而有效地停止了您的循环。解决方法:将c声明为int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2011-03-18
    • 2014-06-04
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多