C语言中&array_name的含义及malloc下失效的原因咨询
关于C语言数组名、&数组名及malloc指针的问题解析
一、&name5不是“地址的地址”,底层原理如下:
- 数组名的隐式转换:在多数表达式语境中,数组名
name5会自动转换为指向数组首元素的指针,等价于&name5[0],类型为char*,其值是数组首元素的起始地址。 &name5的本质:这里取的是整个数组的地址,类型为char (*)[10](指向长度为10的char数组的指针)。虽然它的数值和数组首元素地址完全相同,但二者的类型截然不同:- 对
name5执行+1操作,指针会向后移动1个char的长度; - 对
&name5执行+1操作,指针会向后移动整个数组的长度(10个char)。
- 对
- 数值相同的原因:数组的起始地址与首元素的起始地址是同一个内存位置,因此输出的地址值完全一致。
二、malloc分配的指针场景下&pointer的错误原因
看你的测试代码:
char* name2 = (char*)malloc(10); scanf("%s", &name2); // 错误写法 printf("%s", name2); // 出错
name2本身是一个指针变量,存储的是malloc分配的内存块的首地址,类型为char*,这正是scanf("%s")需要的参数类型(指向字符数组的首地址,用于存储输入的字符串)。&name2取的是指针变量自身的内存地址,类型为char**。把这个地址传给scanf后,scanf会将输入的字符串直接写入指针变量name2的内存空间,破坏了name2原本存储的malloc返回的有效地址。后续printf("%s", name2)时,name2已经变成了一个无效的乱码地址,自然会出错。- 正确写法应为:
char* name2 = (char*)malloc(10); scanf("%s", name2); // 直接传指针变量即可 printf("%s", name2); free(name2); // 记得释放malloc的内存
内容的提问来源于stack exchange,提问作者user20766406
相关产品推荐
相关产品推荐

