关于动态内存申请 各位前辈帮忙看一下 十分感谢!

状态的状 2018-01-12 10:57:08
关于动态内存申请 。(int*) 这个强制转换类型是否起到了作用,如果起了作用,为什么指针长度依旧是初始化定义类型的长度。









#include<stdio.h>
#include<stdlib.h>

int main()
{

void *p;

p= (int *) malloc(sizeof (int)*10);

printf("%d",sizeof(p[0]));



return 0;

}
...全文
527 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-15
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
zilaishuichina 2018-01-15
  • 打赏
  • 举报
回复
引用 12 楼 qq_41036711 的回复:
[quote=引用 3 楼 zilaishuichina 的回复:] 你的p[0] 申明的时候是什么类型, sizeof就按什么类型计算字节数, 而不是按你的p在实际运行的时候,指向的数据的类型去计算字节数, 因为sizeof是一个宏,宏是在编译前完成代码替换的, 也就是编译前, 编译器就已经计算好sizeof的值了,然后将你代码中的sizeof 的地方,替换成一个常量值,然后开始编译,所以这个时候, 编译器不可能能预测的出来,你的这个p在实际运行的时候,到底会指向什么,它只能按你申明p这个变量的时候,你申明的类型去计算
====没有int* 依旧可以正常运行,我只是很奇怪(int* )类型转换起到了什么作用吗,。。只是为了方便转为C++吗[/quote] 在你写的这段代码里, 不起任何作用 问题的关键不在于它起不起作用, 而在于你想干什么,我觉得你的因果关系已经颠倒了 你设计一个程序,应该是首先确定你的这个程序想实现什么功能,然后根据你想实现的功能,挑选(设计)合适的代码 而不是 你设计一个程序,首先挑选一些代码出来去堆砌,然后由这些你随意挑选的代码,来决定你最终想做的这个程序能实现什么功能。
真相重于对错 2018-01-14
  • 打赏
  • 举报
回复
普通的语言,是要让别人能够理解你的意思! 同理。计算机的语言,是要让计算机理解你的意思! 如果你随便吧一些文字堆砌在哪里,你能让别人明白吗?
真相重于对错 2018-01-14
  • 打赏
  • 举报
回复
引用 12 楼 qq_41036711 的回复:
[quote=引用 3 楼 zilaishuichina 的回复:] 你的p[0] 申明的时候是什么类型, sizeof就按什么类型计算字节数, 而不是按你的p在实际运行的时候,指向的数据的类型去计算字节数, 因为sizeof是一个宏,宏是在编译前完成代码替换的, 也就是编译前, 编译器就已经计算好sizeof的值了,然后将你代码中的sizeof 的地方,替换成一个常量值,然后开始编译,所以这个时候, 编译器不可能能预测的出来,你的这个p在实际运行的时候,到底会指向什么,它只能按你申明p这个变量的时候,你申明的类型去计算
====没有int* 依旧可以正常运行,我只是很奇怪(int* )类型转换起到了什么作用吗,。。只是为了方便转为C++吗[/quote] 错误的代码吧,还想得到正确的解释?? 先把基础的语法学好!
状态的状 2018-01-14
  • 打赏
  • 举报
回复
引用 3 楼 zilaishuichina 的回复:
你的p[0] 申明的时候是什么类型, sizeof就按什么类型计算字节数, 而不是按你的p在实际运行的时候,指向的数据的类型去计算字节数, 因为sizeof是一个宏,宏是在编译前完成代码替换的, 也就是编译前, 编译器就已经计算好sizeof的值了,然后将你代码中的sizeof 的地方,替换成一个常量值,然后开始编译,所以这个时候, 编译器不可能能预测的出来,你的这个p在实际运行的时候,到底会指向什么,它只能按你申明p这个变量的时候,你申明的类型去计算
====没有int* 依旧可以正常运行,我只是很奇怪(int* )类型转换起到了什么作用吗,。。只是为了方便转为C++吗
真相重于对错 2018-01-13
  • 打赏
  • 举报
回复
首先确定p[0]是什么? 就是一个void,sizeof(void),在老版编译器上可能会通过编译 在比较新的编译器上是错误!
jieweijason 2018-01-13
  • 打赏
  • 举报
回复
引用 4楼paschen 的回复:
(int *) 相当于把malloc的返回值转换成了int*,但由于你的p是void*,接下来又隐式转换为void*,所以你转换成int*相当于没意义,如果要int*,你要把p也定义为int*的变量
对头
真相重于对错 2018-01-13
  • 打赏
  • 举报
回复
void != void*
十七郎 2018-01-13
  • 打赏
  • 举报
回复
void 类型的 指针 长度由编译器所在的平台决定,64位sizeof(void *) 是 8, 32位是4 16位是2。。。。。。
状态的状 2018-01-12
  • 打赏
  • 举报
回复
这个代码运行是出错的
zzgoucx 2018-01-12
  • 打赏
  • 举报
回复
#include<stdio.h> #include<stdlib.h> int main() { void *p; short *q; (int *) p= malloc(sizeof (int)*10); (float *)q= malloc(sizeof (int)*10); printf("%d",sizeof(p[0])); printf("%d",sizeof(q[0])); return 0; }
zzgoucx 2018-01-12
  • 打赏
  • 举报
回复
您好!关于您的代码我看了,我觉得是因为您在printf()这里用了%d,所以无论您如何强制转换,都是输出同样的结果,十进制整型
paschen 2018-01-12
  • 打赏
  • 举报
回复
(int *) 相当于把malloc的返回值转换成了int*,但由于你的p是void*,接下来又隐式转换为void*,所以你转换成int*相当于没意义,如果要int*,你要把p也定义为int*的变量
zilaishuichina 2018-01-12
  • 打赏
  • 举报
回复
你的p[0] 申明的时候是什么类型, sizeof就按什么类型计算字节数, 而不是按你的p在实际运行的时候,指向的数据的类型去计算字节数, 因为sizeof是一个宏,宏是在编译前完成代码替换的, 也就是编译前, 编译器就已经计算好sizeof的值了,然后将你代码中的sizeof 的地方,替换成一个常量值,然后开始编译,所以这个时候, 编译器不可能能预测的出来,你的这个p在实际运行的时候,到底会指向什么,它只能按你申明p这个变量的时候,你申明的类型去计算
自信男孩 2018-01-12
  • 打赏
  • 举报
回复
void类型的指针,无法知道sizeof(p[0]);的长度。对待void类型,编译器可能按照1字节处理了吧 第一个short *p,sizeof(p[0]);其实sizeof是一个宏,它计算是的是某个变量的类型长度。因此第一个输出是2; 第二个输出是1,第三个int *p输出是4.因为p[0]是int类型
状态的状 2018-01-12
  • 打赏
  • 举报
回复




不使用类型转换依旧可以运行

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧