鱼C论坛

 找回密码
 立即注册
查看: 3028|回复: 10

[已解决]关于typedef定义基础类型问题

[复制链接]
发表于 2018-6-25 16:32:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 理想小青年 于 2018-6-25 16:35 编辑

如图,typedef double ElemType这样来定义,好处我知道(现在看可能理解比较片面),问题如下:
问题:结构体内部定义的元素(ElemType *top),也可以看做 double *top。
那么我在InitStack(sqStack *s),传入结构体指针变量s->base指向一个malloc临时申请空间内存,可是用(ElemType *)用(double *)做结构体申请?这一点学栈没明白!!说以我说typedef学的还是不会......一般不都是引用结构体为申请临时内存体大小,(sqStack *)malloc(sizeof(saStack) * szie)不该这样吗?

1529915188(1).jpg
最佳答案
2018-6-25 17:25:18
理想小青年 发表于 2018-6-25 17:14
后面的呢sizeof(struct)不应该是结构体大小

为什么要是结构体的大小?
等号左边就是一个ElemType的指针而已,分配内存的时候当然只需要分配同类型的即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-25 16:53:33 | 显示全部楼层
前面的(ElemType *)只是一个强制转换的作用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 17:02:28 | 显示全部楼层
C语言复杂声明解析
https://blog.csdn.net/wangweixaut061/article/details/6549768

文章有点长,耐心看完,会对你有帮助的

下面两个程序是一样的,至少在汇编语言层是一样的

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

  3. #define STACK_INIT_SIZE 100

  4. typedef double ElemType;

  5. typedef struct
  6. {
  7.         ElemType *base;
  8.         ElemType *top;
  9. } sqStack;

  10. void InitStack(sqStack *s)
  11. {
  12. 00FBF0E0 55                   push        ebp  
  13. 00FBF0E1 8B EC                mov         ebp,esp  
  14. 00FBF0E3 81 EC C0 00 00 00    sub         esp,0C0h  
  15. 00FBF0E9 53                   push        ebx  
  16. 00FBF0EA 56                   push        esi  
  17. 00FBF0EB 57                   push        edi  
  18. 00FBF0EC 8D BD 40 FF FF FF    lea         edi,[ebp-0C0h]  
  19. 00FBF0F2 B9 30 00 00 00       mov         ecx,30h  
  20. 00FBF0F7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
  21. 00FBF0FC F3 AB                rep stos    dword ptr es:[edi]  
  22.         s->base = malloc(STACK_INIT_SIZE * sizeof(ElemType));
  23. 00FBF0FE 68 20 03 00 00       push        320h  
  24. 00FBF103 E8 12 AD FF FF       call        _malloc (0FB9E1Ah)  
  25. 00FBF108 83 C4 04             add         esp,4  
  26. 00FBF10B 8B 4D 08             mov         ecx,dword ptr [s]  
  27. 00FBF10E 89 01                mov         dword ptr [ecx],eax  
  28.         s->top = s->base;
  29. 00FBF110 8B 45 08             mov         eax,dword ptr [s]  
  30. 00FBF113 8B 4D 08             mov         ecx,dword ptr [s]  
  31. 00FBF116 8B 11                mov         edx,dword ptr [ecx]  
  32. 00FBF118 89 50 04             mov         dword ptr [eax+4],edx  
  33. }
  34. 00FBF11B 5F                   pop         edi  
  35. 00FBF11C 5E                   pop         esi  
  36. 00FBF11D 5B                   pop         ebx  
  37. 00FBF11E 81 C4 C0 00 00 00    add         esp,0C0h  
  38. 00FBF124 3B EC                cmp         ebp,esp  
  39. 00FBF126 E8 58 B2 FF FF       call        __RTC_CheckEsp (0FBA383h)  
  40. 00FBF12B 8B E5                mov         esp,ebp  
  41. 00FBF12D 5D                   pop         ebp  
  42. 00FBF12E C3                   ret  
  43. --- 无源文件 -----------------------------------------------------------------------
  44. 00FBF12F CC                   int         3  
  45. 00FBF130 CC                   int         3  
  46. 00FBF131 CC                   int         3  
  47. 00FBF132 CC                   int         3  
  48. 00FBF133 CC                   int         3  
  49. 00FBF134 CC                   int         3  
  50. 00FBF135 CC                   int         3  
  51. 00FBF136 CC                   int         3  
  52. 00FBF137 CC                   int         3  
  53. 00FBF138 CC                   int         3  
  54. 00FBF139 CC                   int         3  
  55. 00FBF13A CC                   int         3  
  56. 00FBF13B CC                   int         3  
  57. 00FBF13C CC                   int         3  
  58. 00FBF13D CC                   int         3  
  59. 00FBF13E CC                   int         3  
  60. 00FBF13F CC                   int         3  
  61. 00FBF140 CC                   int         3  
  62. 00FBF141 CC                   int         3  
  63. 00FBF142 CC                   int         3  
  64. 00FBF143 CC                   int         3  
  65. 00FBF144 CC                   int         3  
  66. 00FBF145 CC                   int         3  
  67. 00FBF146 CC                   int         3  
  68. 00FBF147 CC                   int         3  
  69. 00FBF148 CC                   int         3  
  70. 00FBF149 CC                   int         3  
  71. 00FBF14A CC                   int         3  
  72. 00FBF14B CC                   int         3  
  73. 00FBF14C CC                   int         3  
  74. 00FBF14D CC                   int         3  
  75. 00FBF14E CC                   int         3  
  76. 00FBF14F CC                   int         3  
  77. --- c:\visualstudioprojects\c\c\main.c -----------------------------------------

  78. int main(void)
  79. {
  80. 00FBF150 55                   push        ebp  
  81. 00FBF151 8B EC                mov         ebp,esp  
  82. 00FBF153 81 EC D0 00 00 00    sub         esp,0D0h  
  83. 00FBF159 53                   push        ebx  
  84. 00FBF15A 56                   push        esi  
  85. 00FBF15B 57                   push        edi  
  86. 00FBF15C 8D BD 30 FF FF FF    lea         edi,[ebp-0D0h]  
  87. 00FBF162 B9 34 00 00 00       mov         ecx,34h  
  88. 00FBF167 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
  89. 00FBF16C F3 AB                rep stos    dword ptr es:[edi]  
  90.         sqStack s;
  91.         InitStack(&s);
  92. 00FBF16E 8D 45 F4             lea         eax,[s]  
  93. 00FBF171 50                   push        eax  
  94. 00FBF172 E8 78 C8 FF FF       call        _InitStack (0FBB9EFh)  
  95. 00FBF177 83 C4 04             add         esp,4  

  96.         return 0;
  97. 00FBF17A 33 C0                xor         eax,eax  
  98. }
  99. 00FBF17C 52                   push        edx  
  100. 00FBF17D 8B CD                mov         ecx,ebp  
  101. 00FBF17F 50                   push        eax  
  102. 00FBF180 8D 15 A4 F1 FB 00    lea         edx,ds:[0FBF1A4h]  
  103. 00FBF186 E8 B6 C1 FF FF       call        @_RTC_CheckStackVars@8 (0FBB341h)  
  104. 00FBF18B 58                   pop         eax  
  105. 00FBF18C 5A                   pop         edx  
  106. 00FBF18D 5F                   pop         edi  
  107. 00FBF18E 5E                   pop         esi  
  108. 00FBF18F 5B                   pop         ebx  
  109. 00FBF190 81 C4 D0 00 00 00    add         esp,0D0h  
  110. 00FBF196 3B EC                cmp         ebp,esp  
  111. 00FBF198 E8 E6 B1 FF FF       call        __RTC_CheckEsp (0FBA383h)  
  112. 00FBF19D 8B E5                mov         esp,ebp  
  113. 00FBF19F 5D                   pop         ebp  
  114. 00FBF1A0 C3                   ret  
复制代码

  1. //#include <stdio.h>
  2. //#include <stdlib.h>
  3. //
  4. //#define STACK_INIT_SIZE 100
  5. //
  6. //typedef double ElemType;
  7. //
  8. //typedef struct
  9. //{
  10. //        ElemType *base;
  11. //        ElemType *top;
  12. //} sqStack;
  13. //
  14. //void InitStack(sqStack *s)
  15. //{
  16. //        s->base = malloc(STACK_INIT_SIZE * sizeof(ElemType));
  17. //        s->top = s->base;
  18. //}
  19. //
  20. //int main(void)
  21. //{
  22. //        sqStack s;
  23. //        InitStack(&s);
  24. //
  25. //        return 0;
  26. //}

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

  29. #define STACK_INIT_SIZE 100

  30. //typedef double ElemType;

  31. typedef struct
  32. {
  33.         double *base;
  34.         double *top;
  35. } sqStack;

  36. void InitStack(sqStack *s)
  37. {
  38. 0007F0E0 55                   push        ebp  
  39. 0007F0E1 8B EC                mov         ebp,esp  
  40. 0007F0E3 81 EC C0 00 00 00    sub         esp,0C0h  
  41. 0007F0E9 53                   push        ebx  
  42. 0007F0EA 56                   push        esi  
  43. 0007F0EB 57                   push        edi  
  44. 0007F0EC 8D BD 40 FF FF FF    lea         edi,[ebp-0C0h]  
  45. 0007F0F2 B9 30 00 00 00       mov         ecx,30h  
  46. 0007F0F7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
  47. 0007F0FC F3 AB                rep stos    dword ptr es:[edi]  
  48.         s->base = malloc(STACK_INIT_SIZE * sizeof(double));
  49. 0007F0FE 68 20 03 00 00       push        320h  
  50. 0007F103 E8 12 AD FF FF       call        _malloc (079E1Ah)  
  51. 0007F108 83 C4 04             add         esp,4  
  52. 0007F10B 8B 4D 08             mov         ecx,dword ptr [s]  
  53. 0007F10E 89 01                mov         dword ptr [ecx],eax  
  54.         s->top = s->base;
  55. 0007F110 8B 45 08             mov         eax,dword ptr [s]  
  56. 0007F113 8B 4D 08             mov         ecx,dword ptr [s]  
  57. 0007F116 8B 11                mov         edx,dword ptr [ecx]  
  58. 0007F118 89 50 04             mov         dword ptr [eax+4],edx  
  59. }
  60. 0007F11B 5F                   pop         edi  
  61. }
  62. 0007F11C 5E                   pop         esi  
  63. 0007F11D 5B                   pop         ebx  
  64. 0007F11E 81 C4 C0 00 00 00    add         esp,0C0h  
  65. 0007F124 3B EC                cmp         ebp,esp  
  66. 0007F126 E8 58 B2 FF FF       call        __RTC_CheckEsp (07A383h)  
  67. 0007F12B 8B E5                mov         esp,ebp  
  68. 0007F12D 5D                   pop         ebp  
  69. 0007F12E C3                   ret  
  70. --- 无源文件 -----------------------------------------------------------------------
  71. 0007F12F CC                   int         3  
  72. 0007F130 CC                   int         3  
  73. 0007F131 CC                   int         3  
  74. 0007F132 CC                   int         3  
  75. 0007F133 CC                   int         3  
  76. 0007F134 CC                   int         3  
  77. 0007F135 CC                   int         3  
  78. 0007F136 CC                   int         3  
  79. 0007F137 CC                   int         3  
  80. 0007F138 CC                   int         3  
  81. 0007F139 CC                   int         3  
  82. 0007F13A CC                   int         3  
  83. 0007F13B CC                   int         3  
  84. 0007F13C CC                   int         3  
  85. 0007F13D CC                   int         3  
  86. 0007F13E CC                   int         3  
  87. 0007F13F CC                   int         3  
  88. 0007F140 CC                   int         3  
  89. 0007F141 CC                   int         3  
  90. 0007F142 CC                   int         3  
  91. 0007F143 CC                   int         3  
  92. 0007F144 CC                   int         3  
  93. 0007F145 CC                   int         3  
  94. 0007F146 CC                   int         3  
  95. 0007F147 CC                   int         3  
  96. 0007F148 CC                   int         3  
  97. 0007F149 CC                   int         3  
  98. 0007F14A CC                   int         3  
  99. 0007F14B CC                   int         3  
  100. 0007F14C CC                   int         3  
  101. 0007F14D CC                   int         3  
  102. 0007F14E CC                   int         3  
  103. 0007F14F CC                   int         3  
  104. --- c:\visualstudioprojects\c\c\main.c -----------------------------------------

  105. int main(void)
  106. {
  107. 0007F150 55                   push        ebp  
  108. 0007F151 8B EC                mov         ebp,esp  
  109. 0007F153 81 EC D0 00 00 00    sub         esp,0D0h  
  110. 0007F159 53                   push        ebx  
  111. 0007F15A 56                   push        esi  
  112. 0007F15B 57                   push        edi  
  113. 0007F15C 8D BD 30 FF FF FF    lea         edi,[ebp-0D0h]  
  114. 0007F162 B9 34 00 00 00       mov         ecx,34h  
  115. 0007F167 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
  116. 0007F16C F3 AB                rep stos    dword ptr es:[edi]  
  117.         sqStack s;
  118.         InitStack(&s);
  119. 0007F16E 8D 45 F4             lea         eax,[s]  
  120. 0007F171 50                   push        eax  
  121. 0007F172 E8 78 C8 FF FF       call        _InitStack (07B9EFh)  
  122. 0007F177 83 C4 04             add         esp,4  

  123.         return 0;
  124. 0007F17A 33 C0                xor         eax,eax  
  125. }
  126. 0007F17C 52                   push        edx  
  127. 0007F17D 8B CD                mov         ecx,ebp  
  128. 0007F17F 50                   push        eax  
  129. }
  130. 0007F180 8D 15 A4 F1 07 00    lea         edx,ds:[7F1A4h]  
  131. 0007F186 E8 B6 C1 FF FF       call        @_RTC_CheckStackVars@8 (07B341h)  
  132. 0007F18B 58                   pop         eax  
  133. 0007F18C 5A                   pop         edx  
  134. 0007F18D 5F                   pop         edi  
  135. 0007F18E 5E                   pop         esi  
  136. 0007F18F 5B                   pop         ebx  
  137. 0007F190 81 C4 D0 00 00 00    add         esp,0D0h  
  138. 0007F196 3B EC                cmp         ebp,esp  
  139. 0007F198 E8 E6 B1 FF FF       call        __RTC_CheckEsp (07A383h)  
  140. 0007F19D 8B E5                mov         esp,ebp  
  141. 0007F19F 5D                   pop         ebp  
  142. 0007F1A0 C3                   ret  
复制代码

  1. //#include <stdio.h>
  2. //#include <stdlib.h>
  3. //
  4. //#define STACK_INIT_SIZE 100
  5. //
  6. //typedef double ElemType;
  7. //
  8. //typedef struct
  9. //{
  10. //        ElemType *base;
  11. //        ElemType *top;
  12. //} sqStack;
  13. //
  14. //void InitStack(sqStack *s)
  15. //{
  16. //        s->base = malloc(STACK_INIT_SIZE * sizeof(ElemType));
  17. //        s->top = s->base;
  18. //}
  19. //
  20. //int main(void)
  21. //{
  22. //        sqStack s;
  23. //        InitStack(&s);
  24. //
  25. //        return 0;
  26. //}

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

  29. #define STACK_INIT_SIZE 100

  30. //typedef double ElemType;

  31. typedef struct
  32. {
  33.         double *base;
  34.         double *top;
  35. } sqStack;

  36. void InitStack(sqStack *s)
  37. {
  38.         s->base = malloc(STACK_INIT_SIZE * sizeof(double));
  39.         s->top = s->base;
  40. }

  41. int main(void)
  42. {
  43.         sqStack s;
  44.         InitStack(&s);

  45.         return 0;
  46. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 17:14:18 | 显示全部楼层
BngThea 发表于 2018-6-25 16:53
前面的(ElemType *)只是一个强制转换的作用

后面的呢sizeof(struct)不应该是结构体大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 17:21:06 | 显示全部楼层
理想小青年 发表于 2018-6-25 17:14
后面的呢sizeof(struct)不应该是结构体大小

s->base = malloc(STACK_INIT_SIZE * sizeof(ElemType));
就相当于
s->base = malloc(STACK_INIT_SIZE * sizeof(double));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 17:23:51 | 显示全部楼层
理想小青年 发表于 2018-6-25 17:14
后面的呢sizeof(struct)不应该是结构体大小

sizeof(sqStack) 就是两个指针的大小
两个 double 类型的指针的大小

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 17:25:18 | 显示全部楼层    本楼为最佳答案   
理想小青年 发表于 2018-6-25 17:14
后面的呢sizeof(struct)不应该是结构体大小

为什么要是结构体的大小?
等号左边就是一个ElemType的指针而已,分配内存的时候当然只需要分配同类型的即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 18:57:29 | 显示全部楼层
人造人 发表于 2018-6-25 17:21
s->base = malloc(STACK_INIT_SIZE * sizeof(ElemType));
就相当于
s->base = malloc(STACK_INIT_SIZE  ...

好像一开始学malloc这一块思想就不对  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 18:58:54 | 显示全部楼层
BngThea 发表于 2018-6-25 17:25
为什么要是结构体的大小?
等号左边就是一个ElemType的指针而已,分配内存的时候当然只需要分配同类型的 ...

一开始学习这块内存管理思想就不对 一直以为申请临时内存 以结构体大小为申请引子来作
链表那时候也是自己学的 理所当然就这样认为了
相同类型即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 19:21:06 | 显示全部楼层
本帖最后由 人造人 于 2018-6-25 19:22 编辑
理想小青年 发表于 2018-6-25 18:57
好像一开始学malloc这一块思想就不对


2.png

void *__cdecl malloc(size_t _Size);
malloc 有一个参数,返回一个指针, void 类型的指针
malloc 从堆中申请 _Size 个字节的内存空间,然后返回这段内存空间的首地址


1.png

可以看到 STACK_INIT_SIZE * sizeof(ElemType) 的值是 800,因为 sizeof(ElemType) 的值是 8
也就是从堆中申请 800 个字节的内存空间,至于你要如何用,那是你的事,你完全可以用这段内存空间存储一个字符串 ^_^

你完全可以这么写
char *buf = malloc(800);
因为 STACK_INIT_SIZE * sizeof(ElemType) 的值就是 800
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-26 11:10:54 | 显示全部楼层
人造人 发表于 2018-6-25 19:21
void *__cdecl malloc(size_t _Size);
malloc 有一个参数,返回一个指针, void 类型的指针
mall ...

我好好看看代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 09:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表