| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1185 人关注过本帖
标题:动态内存分配问题
只看楼主 加入收藏
qq312154421
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:124
专家分:120
注 册:2010-6-7
结帖率:86.36%
收藏
已结贴  问题点数:20 回复次数:23 
动态内存分配问题
# include <stdio.h>
# include <malloc.h>

void f(int ** q)
{
    *q = (int *)malloc(5);
    *(*q+1) = '5';  

}

int main(void)
{
    int * p;

    f(&p);
    printf("%c\n", *(p+1));
    free(p);

    return 0;
}

大家看看红色的这几行代码有什么问题么,我的用意是把5用一个字节来存。
搜索更多相关主题的帖子: void 内存 include return 动态 
2012-01-14 23:54
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
疑似作業,不要用這種改頭換面的方式變相問作業,次數到一定程度,刪了不出警告的。你好幾個問題帖都是這種形式的,會累加上去計算的。

授人以渔,不授人以鱼。
2012-01-14 23:57
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:4 
一个字节你用char定义变量不就行了吗?

# include <stdio.h>
 # include <malloc.h>
 
void f(char **q)
 {
     *q = (char *)malloc(5);
     *(*q+1) = '5';  
 
}
 
int main(void)
 {
     char * p;
 
    f(&p);
     printf("%c\n", *(p+1));
     free(p);

    return 0;
 }
2012-01-15 02:58
cuijingchun
Rank: 3Rank: 3
来 自:黑龙江
等 级:论坛游侠
威 望:1
帖 子:108
专家分:186
注 册:2011-9-28
收藏
得分:4 
    *q = (int *)malloc(5);
    *(*q+1) = '5';  
malloc 用法
void malloc (sizeof(void))
int malloc (sizeof(int)) 在vc6.0是4个字节

int malloc (sizeof(char)) 或
int malloc (1)
 会在vc6.0 少了一个3个字节, 字节丢了

为自己喜欢游戏做一个自动打怪的程序QQ: 7325231    YY4350晚上编程课欢迎大家来听
2012-01-15 06:12
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:4 
程序代码:
# include <stdio.h>
# include <malloc.h>

void f(int **q)
{
    *q = (int *)malloc(5);
    *(char *)(*q+1) = '5';           //force to char *, don't destory hcb(heap control block) structure
   
}

int main(void)
{
    int * p;
   
    f(&p);
    printf("%c\n", *(p+1));
    free(p);
   
    return 0;
}

技术问题,请不要以短消息方式提问
2012-01-15 09:38
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:4 
这个问题不确定性比较大,特别是在不同平台上。
1、首先,要考虑大端和小端的问题,否则,你取出来的可能就不是‘5’;
2、不同的操作系统,linux为8位对齐,win32为4位补位8位对齐,这种操作虽然操作非法空间,但不会发生死机情况。不过,可能有些操作系统在malloc时不采用对齐的方式,就会操作到非法空间死机。

编程最好不要用到这种方式,特别是做移植级别的产品。
有什么不清楚可以再发帖讨论。
2012-01-16 12:11
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
回复 6楼 silent_world
1. 单个字节要考虑字节序?
2. heap分配算法是多少对齐,是heap allocator自己的事情,关os什么事?
你解释一下

技术问题,请不要以短消息方式提问
2012-01-16 12:38
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
可简单说明如下:
1、单个字节也要考虑字节序,特别是在对struct bit操作时候;
   并且在楼主的代码中,是当作int *型操作,更加需要考虑大小端问题,如下:
   void f(int ** q)
     {
         *q = (int *)malloc(5);
         *(*q+1) = '5';  
     }
2、heap分配算法确实和os没有关系。其实,我们用另外一个词比较合适:平台,只是楼主为初学者,在回答时抽象到操作系统这个级别。
3、为什么我说楼主的操作在可移植程序中比较危险
          这里是用int *操作char,不会出现问题。如果在char *里面操作int型,就要考虑到cpu指令流水线操作。编程人员如果了解不多,就会出现问题。




[ 本帖最后由 silent_world 于 2012-1-16 14:39 编辑 ]
2012-01-16 14:37
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
回复 8楼 silent_world
你没看到我加了什么吗,他要字符,你就给他字符,不加强转,就是overflow
*(char *)(*q+1) = '5';

技术问题,请不要以短消息方式提问
2012-01-16 15:31
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
不好意思,我所有的答复只是回答楼主的问题。
其他人要请教问题,请另开帖子。
2012-01-16 15:42
快速回复:动态内存分配问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026602 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved