提问人:Vaibhav 提问时间:9/3/2022 最后编辑:Vlad from MoscowVaibhav 更新时间:9/3/2022 访问量:75
将指针转换为指针 **p (malloc(sizeof(int*))) 指向指针 *p
Casting pointer to pointer **p (malloc(sizeof(int*))) to a pointer *p
问:
#include<stdio.h>
#include<stdlib.h>
int main() {
int *n = malloc(sizeof(int*));//line 1
scanf("%d",n);
printf("%d",*n);
}
我不确定这里发生了什么。 第 1 行(在上面的代码片段中)是否意味着 n 现在只是指向 int 的指针? 我们已经开始使用分配给指针的内存作为变量本身? 指针到指针是否强制转换为指向 int 的指针?
答:
1赞
Vlad from Moscow
9/3/2022
#1
在这一行中
int *n = malloc(sizeof(int*));//line 1
您分配的内存大小等于 ,其地址分配给类型为 的指针。sizeof( int * )
n
int *
因此,使用此指针访问内存,它被解释为存储该类型的对象的内存int
scanf("%d",n);
printf("%d",*n);
实际上,用于指定已分配内存大小的参数表达式的类型并不是很重要。例如,你可以写
int *n = malloc( 8 );//line 1
评论
0赞
Vaibhav
9/3/2022
所以 int *n = malloc(sizeof(int*));行为方式与 int *n = malloc(sizeof(int)) 相同吗?
0赞
Vlad from Moscow
9/3/2022
@Vaibhav 你是对的。唯一的区别是表达式 sizeof( int ) 和 sizeof ( int * ) 的值。例如,sizeof( int * ) 可以等于 8,而 sizeof( int ) 可以等于 4。但无论如何,等于 8 的内存范围可以存储 int 类型的对象。
0赞
Vaibhav
9/3/2022
所以这意味着 int **n=malloc(sizeof(double));会按预期工作吗?(n 指向一个位置,该位置进一步指向 int 的内存位置)?@Vlad
1赞
Vlad from Moscow
9/3/2022
@Vaibhav 如果表达式 sizeof( double ) 的值不小于表达式 sizeof( int * ) 的值,则没有问题。
1赞
n. m. could be an AI
9/3/2022
#2
malloc
对类型一无所知,只关心大小。
正确的咒语是
T *t = malloc(sizeof(*t)); // or
T *t = malloc(sizeof(T));
如果你把任何其他表达式传递给它,而它恰好有正确的值,那么你就很幸运了,没有坏事发生。但这是令人困惑的。不要混淆代码的读者。malloc
如果传递给的值大于正确的值,则只会浪费内存。如果它更少,你就有未定义行为的风险。malloc
它是实现定义的,无论是否相同、大于或小于,所以不要这样做。sizeof(int)
sizeof(int*)
评论
0赞
Fe2O3
9/3/2022
除非必要,否则建议不要使用 “()”,并且您的第一个示例更好,因为它不容易粗心引入错误,因为数据类型在语句中只出现一次。sizeof
评论