| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 989 人关注过本帖
标题:c语言数据结构 (严版)图 GetVex(G,V)操作有问题
只看楼主 加入收藏
同生缘
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-18
结帖率:0
收藏
已结贴  问题点数:10 回复次数:6 
c语言数据结构 (严版)图 GetVex(G,V)操作有问题
代码实现:
程序代码:
/* c7-1.h 图的数组(邻接矩阵)存储表示 */

 #define INFINITY INT_MAX /* 用整型最大值代替∞ */

 #define MAX_VERTEX_NUM 20 /* 最大顶点个数 */

 typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */

 typedef struct

 {
   VRType adj; /* 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否; */
           /* 对带权图,c则为权值类型 */
   InfoType *info; /* 该弧相关信息的指针(可无) */

 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

 typedef struct

 {
   VertexType vexs[MAX_VERTEX_NUM]; /* 顶点向量 */
   AdjMatrix arcs; /* 邻接矩阵 */
   int vexnum,arcnum; /* 图的当前顶点数和弧数 */
   GraphKind kind; /* 图的种类标志 */

 }MGraph;

程序代码:
 VertexType* GetVex(MGraph G,int v)

 { /* 初始条件: 图G存在,v是G中某个顶点的序号。操作结果: 返回v的值 */
   if(v>=G.vexnum||v<0)
     exit(ERROR);
   return &G.vexs[v];

 }


编译时提示 返回local value,因为函数入口是按值传递,所以返回的应该是函数里的局域变量的地址,函数调用后
,该变量销毁,所以得到函数返回的指针会出错。
所以书本的操作设计有问题,对吗?
搜索更多相关主题的帖子: 最大值 color c语言 
2011-02-16 01:21
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:5 
程序代码:
#include <stdio.h>
#include <stdlib.h>

int * Get( int a[], int b )
{
    if( b>= 5 || b<0 )
    {
        exit( 0 );
    }
    else
    {
        return &a[b];
    }
}

int main()
{
    int a[] = {2, 4, 5, 3, 1};
    printf("%d \n",  &a[2]);
    printf("%d \n", Get(a, 2));

    return 0;
}
2011-02-23 08:24
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:5 
向LS的学习了哈
呵呵
2011-02-26 10:38
同生缘
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-18
收藏
得分:0 
我看是因为编译器的问题?GCC Linux ,    VC windows
复制数组是 堆上分配,那就无问题,变量不会销毁,但是每一调用就复制一个数组,消耗量大。
如果是栈上分配,就会出错吧

理性爱国。
理性上网。
2011-02-28 23:33
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
数组 传过来的是首地址  
相当于 主、被调函数操作的数组的地址是相同的 都是在主函数的栈中(静态)   看下底下的汇编 也可以啊 基址加变址
2011-03-01 23:03
同生缘
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-18
收藏
得分:0 
回复 5楼 寒风中的细雨
我的问题是结构体传值,看来我把问题复杂化。
结构体里的数组变量,也是一个变量。
理应是在栈上分配内存。
可是在winows竟然可以正常运行,查过原数组和副本数组地址一样,可
见编译器做了一个优化,直接使用参数里面的数组变量,目的大概是避免大量复制。
机制大概如  char * p = "hello";
            char * d = "hello";
 然后两个指针指向同一块内存,看具体编译器。
           

理性爱国。
理性上网。
2011-03-18 10:27
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
char * p = "hello";
char * d = "hello";
“hello” 是一个字符串常量   在常量表中 变量p 和 d 都是指向同一个地址   

在栈上分配空间 和 在堆分配空间不同在于  堆在自己不主动释放的时候是不会销毁的(退出运行程序另当别论)
                  在栈分配的空间是在退出本层函数的时候 在本层开辟的空间(给局部变量)会自动回收 通过esp操作,
                  当main中的局部变量没有离开main体的时候 它的地址始终有效 main中调用其他的函数操作
                  这个有效的地址 来达到改变main中局部变量的值 是可以做到的   
2011-03-18 12:17
快速回复:c语言数据结构 (严版)图 GetVex(G,V)操作有问题
数据加载中...
 
   



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

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