【发布时间】:2017-09-21 21:01:22
【问题描述】:
我正在开发一个读取 .txt 文件的短程序。最初,我在 main 函数中玩耍,并且我的代码可以正常工作。后来,我决定把它抽象成一个函数。现在,我似乎无法让我的代码工作,而且我已经被这个问题挂断了很长一段时间。
我认为我最大的问题是我并不真正了解内存/硬件级别的情况。我知道指针只是保存一个内存地址,而指向指针的指针只是将内存地址保存到另一个内存地址,这是我们真正想要的简短的面包屑路径。
然而,既然我正在引入 malloc() 来扩展分配的内存量,我似乎忽略了正在发生的事情。事实上,我已经完全不知道该如何看待记忆了。
所以,一个字符占用一个字节,对吗? 如果我理解正确,那么由一个 char* 占用一个字节的内存? 如果我们有一个:
char* str = "hello"
假设它占用 6 个字节的内存(包括空字符)可以说安全吗?
而且,如果我们想为一些在编译时未知的“大小”分配内存,那么我们需要动态分配内存。
int size = determine_size();
char* str = NULL;
str = (char*)malloc(size * sizeof(char));
到目前为止,这在语法上是否正确? 现在,如果你要判断我的解释。我们告诉编译器我们需要为字符保留“大小”数量的连续内存。如果 size 等于 10,那么 str* 将指向 10 个内存地址中的第一个地址,对吗?
现在,如果我们能更进一步。
int size = determine_size();
char* str = NULL;
file_read("filename.txt", size, &str);
这是我的脚开始离开地面的地方。我的解释是 file_read() 看起来像这样:
int file_read(char* filename, int size, char** buffer) {
// Set up FILE stream
// Allocate memory to buffer
buffer = malloc(size * sizeof(char));
// Add characters to buffer
int i = 0;
char c;
while((c=fgetc(file))!=EOF){
*(buffer + i) = (char)c;
i++;
}
将字符添加到缓冲区并分配内存是我似乎无法理解的事情。
如果 **buffer 指向 *str 等于 null,那么我如何为 *str 分配内存并为其添加字符?
我知道这很长,但我很感谢大家花时间阅读这篇文章!如果我能澄清任何事情,请告诉我。
编辑:
哇,我的代码现在可以运行了,非常感谢!
虽然,我不知道为什么会这样:
*((*buffer) + i) = (char)c;
【问题讨论】:
-
buffer = malloc(size * sizeof(char));-->*buffer = malloc(size * sizeof(char)); -
str = (char*)(size * sizeof(char);应该是str = (char*)malloc(size * sizeof(char); -
char c; while((c=fgetc(file))!=EOF){ *(buffer + i) = (char)c;i++; }-->int c; while((c=fgetc(file))!=EOF && i < size-1){ (*buffer)[i++] = c;} (*buffer)[i] = 0; -
那是小说,不是问题。学习How to Ask并提供minimal reproducible example。
-
@FaridKaradsheh 正如 BLUEPIXY 指出的那样,变量 c 应该声明为 int 类型而不是 char 因为通常 char 可以表现为无符号字符。在这种情况下,条件 (c=fgetc(file))!=EOF 将始终为真。:)
标签: c pointers memory-management