将指针转换为指针 **p (malloc(sizeof(int*))) 指向指针 *p

Casting pointer to pointer **p (malloc(sizeof(int*))) to a pointer *p

提问人:Vaibhav 提问时间:9/3/2022 最后编辑:Vlad from MoscowVaibhav 更新时间:9/3/2022 访问量:75

问:

#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 的指针?

enter image description here

c 指针 malloc sizeof

评论


答:

1赞 Vlad from Moscow 9/3/2022 #1

在这一行中

int *n = malloc(sizeof(int*));//line 1

您分配的内存大小等于 ,其地址分配给类型为 的指针。sizeof( int * )nint *

因此,使用此指针访问内存,它被解释为存储该类型的对象的内存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