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

#define  LEN   sizeof(struct stu_power)

struct  stu_power
    {
        char                *stu_name;
        unsigned int        power;
        struct stu_power    *next;
    };

int main ()
{
    struct  stu_power   *head;      //head存放 stu_power的首地址

    head = (struct stu_power *) malloc(LEN);

    head->stu_name = "xyz";                           //malloc(LEN) 是12字节,malloc申请的内存是固定的呀, stu_name是一个字符指针啊,在未指向存储空间的时候怎么能赋值呢。
                                                                       //那为什么head->stu_name还可以输入任意长度的字符串啊
    head->power    = 999;

    printf ("%s --> %d\n", head->stu_name, head->power);

    return 0;
}



[ 本帖最后由 admin_xyz 于 2012-10-30 22:25 编辑 ]
搜索更多相关主题的帖子: 内存 动态 power 
2012-10-30 22:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你把这个程序反汇编了自己看看就知道怎么回事了嘛。输入?你运行过让你输入了?

授人以渔,不授人以鱼。
2012-10-30 22:44
MidSummer
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-10-28
收藏
得分:0 
回复 楼主 admin_xyz
在给指针赋字符串时,系统其实自动先给这个字符串分配了内存,然后把这个内存的地址赋给指针。
head->stu_name = "xyz";  相当于系统进行了这样的操作: char a[]="xyz" ; head->str_name=a; 所以你没给stu_name分配空间的情况下也可以给它赋字符串值。

至于为什么head->stu_name还可以输入任意长度的字符串,因为不管你输入多长的字符串,系统赋给这个指针的值永远是4字节,结合上面说的第一个问题,你输入的字符串全都由系统自动分配了内存赋给数组a,然后把a赋给head->stu_name指针。
2012-10-31 00:06
zhangqi_gsts
Rank: 6Rank: 6
来 自:甘肃天水
等 级:侠之大者
威 望:1
帖 子:227
专家分:457
注 册:2011-3-27
收藏
得分:0 
你malloc只是是给head分配空间了,head里面的stu_name,它仍然是个 *char型的,是个指针,所以head->stu_name = "xyz";这样也就当然可以了。
你可能觉得stu_name 也被分配空间了,所以head->stu_name = "xyz"这样不对,的确,如果stu_name 分配空间了,这样是错的,那就要用strcpy()。
如果你要达到这种效果,就要对stu_name 在此分配空间,因为它现在只是个指针,只能指向一个字符串,但不能存储。
head->stu_name = (char *)malloc(sizeof(char) * 100);这样一来head->stu_name = "xyz"肯定就是错的了。

深刻理解malloc,它只是给head分配了空间,这个空间里面有个char 型的指针,可以用来指向一个字符串,仅此而已
2012-10-31 00:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
自己看吧,不解释:
程序代码:
; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.50727.1 

    TITLE    Test.cpp
    .686P
    .XMM
    include listing.inc
    .model    flat

INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES

PUBLIC    _main
PUBLIC    ??_C@_03POMAGKDD@xyz?$AA@            ; `string'
PUBLIC    ??_C@_0L@ONEJGDMG@?$CFs?5?9?9?$DO?5?$CFd?6?$AA@    ; `string'
EXTRN    __imp__printf:PROC
EXTRN    __imp__malloc:PROC
EXTRN    __RTC_CheckEsp:PROC
EXTRN    __RTC_InitBase:PROC
EXTRN    __RTC_Shutdown:PROC
;    COMDAT rtc$TMZ
rtc$TMZ    SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ    ENDS
;    COMDAT rtc$IMZ
rtc$IMZ    SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
rtc$IMZ    ENDS
;    COMDAT ??_C@_0L@ONEJGDMG@?$CFs?5?9?9?$DO?5?$CFd?6?$AA@
CONST    SEGMENT
??_C@_0L@ONEJGDMG@?$CFs?5?9?9?$DO?5?$CFd?6?$AA@ DB '%s --> %d', 0aH, 00H ; `string'
CONST    ENDS
;    COMDAT ??_C@_03POMAGKDD@xyz?$AA@
CONST    SEGMENT
??_C@_03POMAGKDD@xyz?$AA@ DB 'xyz', 00H            ; `string'
CONST    ENDS
; Function compile flags: /Odtp /RTCsu /ZI
; File test.cpp
;    COMDAT _main
_TEXT    SEGMENT
_head$ = -8                        ; size = 4
_main    PROC                        ; COMDAT

; 16   : {

    push    ebp
    mov    ebp, esp
    sub    esp, 204                ; 000000ccH
    push    ebx
    push    esi
    push    edi
    lea    edi, DWORD PTR [ebp-204]
    mov    ecx, 51                    ; 00000033H
    mov    eax, -858993460                ; ccccccccH
    rep stosd

; 17   :     struct  stu_power   *head;      //head存放 stu_power的首地址
; 18   :
; 19   :     head = (struct stu_power *) malloc(LEN);

    mov    esi, esp
    push    12                    ; 0000000cH
    call    DWORD PTR __imp__malloc
    add    esp, 4
    cmp    esi, esp
    call    __RTC_CheckEsp
    mov    DWORD PTR _head$[ebp], eax

; 20   :
; 21   :     head->stu_name = "xyz";                           //malloc(LEN) 是12字节,malloc申请的内存是固定的呀, stu_name是一个字符指针啊,在未指向存储空间的时候怎么能赋值呢。

    mov    eax, DWORD PTR _head$[ebp]
    mov    DWORD PTR [eax], OFFSET ??_C@_03POMAGKDD@xyz?$AA@

; 22   :                                                                        //那为什么head->stu_name还可以输入任意长度的字符串啊
; 23   :     head->power    = 999;

    mov    eax, DWORD PTR _head$[ebp]
    mov    DWORD PTR [eax+4], 999            ; 000003e7H

; 24   :
; 25   :     printf("%s --> %d\n", head->stu_name, head->power);

    mov    esi, esp
    mov    eax, DWORD PTR _head$[ebp]
    mov    ecx, DWORD PTR [eax+4]
    push    ecx
    mov    edx, DWORD PTR _head$[ebp]
    mov    eax, DWORD PTR [edx]
    push    eax
    push    OFFSET ??_C@_0L@ONEJGDMG@?$CFs?5?9?9?$DO?5?$CFd?6?$AA@
    call    DWORD PTR __imp__printf
    add    esp, 12                    ; 0000000cH
    cmp    esi, esp
    call    __RTC_CheckEsp

; 26   :
; 27   :     return 0;

    xor    eax, eax

; 28   : }

    pop    edi
    pop    esi
    pop    ebx
    add    esp, 204                ; 000000ccH
    cmp    ebp, esp
    call    __RTC_CheckEsp
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP
_TEXT    ENDS
END


[ 本帖最后由 TonyDeng 于 2012-10-31 01:12 编辑 ]

授人以渔,不授人以鱼。
2012-10-31 01:11
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
用汇编解释的 真厉害啊 来学习了
2012-10-31 12:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用zklhp在2012-10-31 12:06:01的发言:

用汇编解释的 真厉害啊 来学习了

这是你的强项啊,来吧。

授人以渔,不授人以鱼。
2012-10-31 16:04
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
看了大牛们的解释,懂了。总结一下,

 head = malloc(LEN) //   为char *stu_name 申请的空间只是4个字节。



总有人比你努力,可怕的是比你牛的人比你还努力。
2012-10-31 20:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用admin_xyz在2012-10-31 20:02:05的发言:

看了大牛们的解释,懂了。总结一下,

 head = malloc(LEN) //   为char *stu_name 申请的空间只是4个字节。

懂你个头,乱来。

授人以渔,不授人以鱼。
2012-10-31 20:03
admin_xyz
Rank: 2
等 级:论坛游民
帖 子:195
专家分:77
注 册:2012-6-24
收藏
得分:0 
回复 9楼 TonyDeng
sizeof(head->stu_name) = 4呀,所以我说为char *stu_name分配4个字节。

总有人比你努力,可怕的是比你牛的人比你还努力。
2012-10-31 20:21
快速回复:动态内存分配小问题
数据加载中...
 
   



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

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