关于将malloc(sizeof(int*))赋值给int*指针的内存使用疑问
代码分析与问题解答
待分析代码
#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的指针的操作?
问题解答
关于指针n的类型:
是的,n的声明为int *n,它的类型明确是指向int的指针(int*),不存在其他类型定义。不过这里malloc分配的是sizeof(int*)大小的内存(即一个指针类型的字节数),而非sizeof(int),属于写法上的不规范,但不改变n本身的类型。是否把分配的内存当普通变量用:
是的。这段代码里,n指向动态分配的一块内存,后续通过scanf("%d", n)往这块内存写入int值,再用*n读取该值,本质就是把这块动态内存当成了存储int的普通变量来使用。
需要注意:如果系统中sizeof(int*)和sizeof(int)大小不同(比如64位系统中指针占8字节、int占4字节),这种写法会浪费部分内存;极端情况下若sizeof(int*)小于sizeof(int),还会导致内存越界,属于不规范写法,正确做法应该是malloc(sizeof(int))。是否存在指针类型转换:
不存在将指向指针的指针(int**)转换为指向int的指针(int*)的操作。malloc返回的是void*类型,会被C语言隐式转换为int*赋值给n,这是合法的隐式转换,但整个过程中没有涉及int**类型的参与,只是分配内存的大小是指针类型的字节数而已。
代码运行截图

内容的提问来源于stack exchange,提问作者Vaibhav
相关产品推荐
相关产品推荐

