社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1401|回复: 18

[求助] 关于内存管理 C语言的问题

[复制链接]

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-26 11:11:50 | 显示全部楼层 |阅读模式
if(!mallco_dev.memmap[memx][offset])cmemb++;//连续空内存块数增加
这句话我看不懂,怎么memmap是个二维数组了
u16 *memmap[SRAMBANK];   
这是前面定义的,是个数组指针
此帖出自stm32/stm8论坛


回复

使用道具 举报

5290

TA的帖子

115

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-26 11:25:27 | 显示全部楼层
指针和数组在某种程度上是等价的,在大多数情况都可以互换表示。例如说:
*(p+1)等价于p[1]
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

5290

TA的帖子

115

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-26 11:33:47 | 显示全部楼层
虽然在访问的时候表达式可以互换,但是在定义的时候却不能混淆,指针和数组的意义确实完全不同的。
所以说:
怎么memmap是个二维数组了

这句话不对,memmap并不是二维数组,只是他可以以二维数组的方式去访问指针罢了。

点评

是不是memmap[memx]是个一维数组的地址,然后再加个【】去表达它的二维。 我看书只看过二维数组用指针的转换表达,没见过,指针数组可以表达指针的二维。。  详情 回复 发表于 2017-1-26 11:47
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-26 11:47:53 | 显示全部楼层
lcofjp 发表于 2017-1-26 11:33
虽然在访问的时候表达式可以互换,但是在定义的时候却不能混淆,指针和数组的意义确实完全不同的。
所以说 ...

是不是memmap[memx]是个一维数组的地址,然后再加个【】去表达它的二维。
我看书只看过二维数组用指针的转换表达,没见过,指针数组可以表达指针的二维。。

点评

你的理解差不多 memmap[memx]是一个指针,可以继续用*或者[]访问,都行。  详情 回复 发表于 2017-1-26 11:56


回复

使用道具 举报

5290

TA的帖子

115

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-26 11:56:57 | 显示全部楼层
大家都是好朋友 发表于 2017-1-26 11:47
是不是memmap[memx]是个一维数组的地址,然后再加个【】去表达它的二维。
我看书只看过二维数组用指针的 ...

你的理解差不多
memmap[memx]是一个指针,可以继续用*或者[]访问,都行。

点评

C语言 太灵活!!  详情 回复 发表于 2017-1-26 12:04
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-26 12:04:27 | 显示全部楼层
lcofjp 发表于 2017-1-26 11:56
你的理解差不多
memmap[memx]是一个指针,可以继续用*或者[]访问,都行。

C语言 太灵活!!


回复

使用道具 举报

6701

TA的帖子

17

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-26 14:08:47 | 显示全部楼层
鬼子写的一本《征服C指针》不错,可以买来看一下,网上也有电子版

点评

好滴  详情 回复 发表于 2017-1-26 14:54
training


回复

使用道具 举报

123

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-26 14:29:58 | 显示全部楼层
本帖最后由 okwh 于 2017-1-26 15:30 编辑

其实,过了指针这一关,c就没问题了。
本质上都是地址和内容,如何使用地址和内容--就衍生出各种各样的形式,这些形式确实很迷惑人的。
建议 对照c和对应的反汇编 一起看,可能就明白地快些了。
先学会嵌入系统指令中的各种寻址方式,就更好了。
咬牙精通一个指令系统,再看这语言那语言的 就如浮云了。

点评

学过51单片机的汇编,还有谭浩强先生的C语言设计。。。 我感觉好像C程序设计写的指针用法在单片机上好多都没见过  详情 回复 发表于 2017-1-26 14:54
熙熙攘攘的世界,我们不懈前行......


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-26 14:54:00 | 显示全部楼层
okwh 发表于 2017-1-26 14:29
其实,过了指针这一关,c就没问题了。
本质上都是地址和内容,如何使用地址和内容--就衍生处理各种各样 ...

学过51单片机的汇编,还有谭浩强先生的C语言设计。。。
我感觉好像C程序设计写的指针用法在单片机上好多都没见过

点评

书上 更多为编译器、为人那一端设计。 嵌入这一端,基本上只用最有效最基本的数据结构-通常只有最基本的--数组指针或指针数组、表格查表、堆栈, 其他如链表、hash表之类的都基本不用。 其实即是在PC上可以  详情 回复 发表于 2017-1-26 15:24


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-26 14:54:32 | 显示全部楼层
白丁 发表于 2017-1-26 14:08
鬼子写的一本《征服C指针》不错,可以买来看一下,网上也有电子版

好滴


回复

使用道具 举报

123

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-26 15:24:13 | 显示全部楼层
本帖最后由 okwh 于 2017-1-26 15:28 编辑
大家都是好朋友 发表于 2017-1-26 14:54
学过51单片机的汇编,还有谭浩强先生的C语言设计。。。
我感觉好像C程序设计写的指针用法在单片机上好多 ...

书上 更多为编译器、为人那一端设计。
嵌入这一端,基本上只用最有效最基本的数据结构-通常只有最基本的--数组指针或指针数组、表格查表、堆栈,
其他如链表、hash表之类的都基本不用。

其实即是在PC上 也可以在调试状态下对比反编译汇编看,只是PC的汇编要复杂些,人们都不愿意学了。 若只是针对特定部分知识来 对比C和汇编,也不难弄懂的。 我一般认为 从嵌入、汇编这儿出发去学习了解指针,就不会被那些 *&〔〕.->  符号搞晕了。那些符号联合混合使用时更是容易晕啊。

点评

还有C程序说不能直接给变量赋地址 但我看这个单片机的程序,需要给某个寄存器赋值,就DEFINE 定义它的地址,然后指针指向它。。。  详情 回复 发表于 2017-1-26 15:47
PC的汇编是什么。。  详情 回复 发表于 2017-1-26 15:45
比如字节对齐,我C语言没见过,51汇编也没见过。 它是伪代码吧?  详情 回复 发表于 2017-1-26 15:45
熙熙攘攘的世界,我们不懈前行......


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-26 15:45:10 | 显示全部楼层
okwh 发表于 2017-1-26 15:24
书上 更多为编译器、为人那一端设计。
嵌入这一端,基本上只用最有效最基本的数据结构-通常只有最基本 ...

比如字节对齐,我C语言没见过,51汇编也没见过。
它是伪代码吧?

点评

51是8位,本身就是字节对齐的,也只可能是,更多如处理16、24、32位就需要自己编程处理。 32机如ARM正好不一样,32位下有处理8/16/24/32/64等各种可能需要,就有了各种让步平衡取舍。 其实还有直接间接位操作...  详情 回复 发表于 2017-1-27 12:44
51是八位机,怎么会有字节对齐的问题呢,这些都是说的32位机了  详情 回复 发表于 2017-1-26 21:34


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-26 15:45:41 | 显示全部楼层
okwh 发表于 2017-1-26 15:24
书上 更多为编译器、为人那一端设计。
嵌入这一端,基本上只用最有效最基本的数据结构-通常只有最基本 ...

PC的汇编是什么。。

点评

PC的汇编 就是 x86系列CPU的指令系统、汇编语言编程开发环境。参考: Microsoft Macro Assembler 8.0 (MASM) 软件包 (x86) ---- https://www.microsoft.com/zh-CN/download/details.aspx?id=12654 The MAS  详情 回复 发表于 2017-1-27 12:50


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-26 15:47:10 | 显示全部楼层
okwh 发表于 2017-1-26 15:24
书上 更多为编译器、为人那一端设计。
嵌入这一端,基本上只用最有效最基本的数据结构-通常只有最基本 ...

还有C程序说不能直接给变量赋地址
但我看这个单片机的程序,需要给某个寄存器赋值,就DEFINE 定义它的地址,然后指针指向它。。。

点评

关键不是能不能,而是能否使用、如何使用.... C语言这范围太广了,通常情况下,给变量赋直接数值表达地址,不能使用。但用&转译赋值是可以的,否则,指针怎么用?  一切一切最终让电路执行时都必须落实到地址和内  详情 回复 发表于 2017-1-27 12:59


回复

使用道具 举报

6701

TA的帖子

17

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-26 21:34:41 | 显示全部楼层
大家都是好朋友 发表于 2017-1-26 15:45
比如字节对齐,我C语言没见过,51汇编也没见过。
它是伪代码吧?

51是八位机,怎么会有字节对齐的问题呢,这些都是说的32位机了

点评

对呀 我是说以前学的都没见过这个  详情 回复 发表于 2017-1-26 21:36
training


回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-26 21:36:40 | 显示全部楼层
白丁 发表于 2017-1-26 21:34
51是八位机,怎么会有字节对齐的问题呢,这些都是说的32位机了

对呀 我是说以前学的都没见过这个


回复

使用道具 举报

123

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-27 12:44:12 | 显示全部楼层
本帖最后由 okwh 于 2017-1-27 13:09 编辑
大家都是好朋友 发表于 2017-1-26 15:45
比如字节对齐,我C语言没见过,51汇编也没见过。
它是伪代码吧?

51是8位,本身就是字节对齐的,也只可能是,更多如处理16、24、32位就需要自己编程处理。
32机如ARM正好不一样,32位下有处理8/16/24/32/64等各种可能需要,就有了各种让步平衡取舍。
其实还有直接间接位操作、还有大端小端......  至于PC机里面如何对齐排列,不让自己管,一切编译器代劳了。
基本原理、宏观结构、细节处理,学习要分层,不然混为一潭,不但容易晕,也让人无法回答。
计算机这种行当相关学习的麻烦之一就是 有时候不知道是学或在学遥控器操作、还是在学电视机内部制造、还是在学单晶硅提炼........
熙熙攘攘的世界,我们不懈前行......


回复

使用道具 举报

123

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-27 12:50:42 | 显示全部楼层
本帖最后由 okwh 于 2017-1-27 13:14 编辑

PC的汇编  就是 x86系列CPU的指令系统、汇编语言编程开发环境。参考:
Microsoft Macro Assembler 8.0 (MASM) 软件包 (x86) ---- https://www.microsoft.com/zh-CN/download/details.aspx?id=12654
The MASM32 SDK  ----  http://www.masm32.com/  
WinAsm Studio   ----  http://www.winasm.net/winasm-studio-full-package.html
比如某些高级黑客他们如何对付代码??
熙熙攘攘的世界,我们不懈前行......


回复

使用道具 举报

123

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-27 12:59:21 | 显示全部楼层
本帖最后由 okwh 于 2017-1-27 13:06 编辑
大家都是好朋友 发表于 2017-1-26 15:47
还有C程序说不能直接给变量赋地址
但我看这个单片机的程序,需要给某个寄存器赋值,就DEFINE 定义它的地 ...

关键不是能不能,而是能否使用、如何使用....
C语言这范围太广了,通常情况下,给变量赋直接数值表达地址,不能使用。但用&转译赋值是可以的,否则,指针怎么用?  一切一切最终让电路执行时都必须落实到地址和内容。
单片机,通常事先就知道所有存储、接口资源的地址和范围多少,当然就可以直接define使用了。而台式机,编译的exe文件采用的相对重定位方法,装入到内存时才确定运行时的地址,所以是无法事先直接用数值指定地址的。
说个比喻: 1 是什么? 铅笔?树枝? 阿拉伯数字? 那么 one ,  壹 , I, 日语的 "以其" 音,德语的 “俺斯”  .........   
把世界上所有语言所有可能的 1 的表达,能全都列出来?又怎么学呢? 那抛开所有表达形式的本质 到底是什么呢?

熙熙攘攘的世界,我们不懈前行......


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-4-27 14:27 , Processed in 0.581965 second(s), 19 queries , Redis On.

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