gpt4 book ai didi

c - 为什么我可以在同时在别处定义指针时使用它?

转载 作者:行者123 更新时间:2023-12-04 07:43:12 25 4
gpt4 key购买 nike

假设我有一个 struct像这样:

typedef struct {
char* author;
uint32_t isbn;
} Book;

int
main( int arg_c; char* arg_v[] ) {
Book* b = malloc( sizeof *b );
char* author = "Miller";

//[...]

free(b);
return 0;
}
现在有点让我失望的是第 8 行: Book* b = malloc( sizeof *b );在这里,我正在创建一个指针 b类型 Book在等号的左侧,但同时,我正在取消引用 b在右侧为 b 分配内存.
这是如何运作的?
我如何同时定义一个指针,因为我使用该指针为其分配内存。
如果他们是 Book* b = malloc( sizeof (Book) );这对我来说很直观,因为 sizeof询问类型的大小。但在这里,就好像标识符在两个地方同时被使用,而它正在被定义。
是否有一些双关的事情,我失踪了?

最佳答案

这个表情

sizeof *b
不被评估。编译器只是尝试确定表达式 *b 的类型而这种类型是 Book .所以实际上这个表达式等价于
sizeof( Book )
变量的类型 b在完成其声明符的定义后已知。所以初始化表达式已经知道初始化对象的类型。
为了更清楚地考虑以下演示程序
#include <stdio.h>

int main(void)
{
int x = 10;

size_t n = sizeof( x += 20 );

printf( "n = %zu, x = %d\n", n, x );

return 0;
}
程序输出是
n = 4, x = 10
作为这个表达
sizeof( x += 20 )
不求值(编译器只确定表达式的类型)然后变量 x 的值没有改变。
另一个更复杂的例子。
#include <stdio.h>

int i = 1;

int main(void)
{
size_t i[i], b = sizeof( i );

printf( "b = %zu\n", b );

return 0;
}
程序输出是
b = 8
在数组声明中 i使用了变量 i在文件范围内声明,因为数组的声明符 i还没有完成。但是在变量 b的声明中使用了标识符 i表示数组。

关于c - 为什么我可以在同时在别处定义指针时使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67340749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com