我是 C 新手,对特定指针声明有疑问:
这是我写的一个程序:
#include <stdlib.h>
struct n {
int x;
int y;
};
int main()
{
struct n **p = malloc(sizeof(struct n));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的声明不正确,但为什么不正确呢?
这是我的思考过程:
malloc指定它返回一个指针:The malloc() and calloc() functions return a pointer to the
allocated memory, which is suitably aligned for any built-in
type.
Run Code Online (Sandbox Code Playgroud)
的类型p又struct n**称为指向另一个指针的指针。
但这个声明在理论上不应该起作用,因为:
malloc返回类型struct n*(指针)p的指针mallocp已满足抱歉,如果这是一个愚蠢的问题,但我真的很困惑为什么这不起作用。感谢您提前提供的任何帮助。
我最近研究了 C 中的文件和输入/输出,很快发现 C 使用一种typedefed 结构FILE,通常表示为指向结构的指针。
该结构包含有关输入和输出的数据,因此操作系统和内核的较低级别部分可以轻松管理系统上的输入和输出,例如输入数据的大小、数据类型等。基本上,它是有目的地抽象
的因为它的工作方式非常低级。
我还知道FILE* xC 程序员通常使用类似的东西来表示输入和输出流。C 还允许FILE常用来指向文件。
为什么C允许程序员使用CFILE来表示文件以及输入/输出流?对我来说,这听起来非常令人困惑,而且这个关键字的字面意思FILE是这样FILE的,我认为它经常会让新程序员感到困惑,认为它仅用于指向文件。
那么为什么FILE同时用于文件和输入/输出呢?
我用 C 语言编写了一个非常简单的函数,它使用strlen()from<string.h>返回变量的长度char*:
int length(char *str) {
return strlen(str);
}
Run Code Online (Sandbox Code Playgroud)
以下是相应的 x86_64 程序集objdump -M intel -d a.out:
00000000000011a8 <length>:
11a8: f3 0f 1e fa endbr64
11ac: 55 push rbp
11ad: 48 89 e5 mov rbp,rsp
11b0: 48 83 ec 10 sub rsp,0x10
11b4: 48 89 7d f8 mov QWORD PTR [rbp-0x8],rdi
11b8: 48 8b 45 f8 mov rax,QWORD PTR [rbp-0x8]
11bc: 48 89 c7 mov rdi,rax
11bf: e8 ac fe ff ff …Run Code Online (Sandbox Code Playgroud) 在读/写操作期间是否绝对有必要检查feof()?
我问的原因是因为我有一个执行读/写一次的程序,下面是代码:
while (1) {
data = read_file_data(file);
write_file_data(data, filename);
if (feof(file))
print(read error)
}
Run Code Online (Sandbox Code Playgroud)
这只是伪代码,但是是否有必要检查feof()像这样一次读取的情况?目前,我认为只有当您在上面的阅读之后再阅读一遍时才有必要,如下所示:
while (1) {
data = read_file_data(file);
write_file_data(data, filename);
if (feof(file)) // feof error occurred oops
print(read error)
data = read_file_data(file); // reading after error
}
Run Code Online (Sandbox Code Playgroud)
EOF reached最后,即使发生错误(读过去) ,阅读会产生什么后果EOF?