| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 192 人关注过本帖
标题:有个结构上的问题
只看楼主 加入收藏
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:422
专家分:868
注 册:2012-10-26
结帖率:97.3%
  已结贴   问题点数:20  回复次数:3   
有个结构上的问题
写VB写久了有点疑惑,不知道C是否可以这样做?
我要创个结构阵列,第一层预设4个,第二层要动态增加,
那每个第一层对上第二层的数量,是否可以皆不相同?

简单讲我要将一个档案依规则拆成四个档案

类似 :
A[0][10]
A[1][20]
A[2][30]
A[3][40]

程序代码:

#include <stdlib.h>
#include <stdio.h>
struct Log
{
    int Line;
    char *ErrorLog;
};
int main(int argc, char* argv[])
{
    int i=0,j=0;
    struct Log **A = (struct Log**)malloc(4*sizeof(struct Log*));
    for(i=0;i<4;i++)
    {
        A[i]=(struct Log*)malloc(10*sizeof(struct Log));//这里要动态增加 (因为是针对每个i增加j,所以想是不是可以不一样?)
        for(j=0;j<10;j++)
        {
            A[i][j].ErrorLog ="";
            A[i][j].Line =0;
        }
    }
    free(A);
    return 0;
}


因为VB好像第二维必须固定长度,第一维才能动态增加,脑袋有点转不过来
2018-10-08 18:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:160
帖 子:6194
专家分:27114
注 册:2014-5-20
  得分:7 
#include <stdio.h>
#include <stdlib.h>

struct Log
{
    int Line;
    char *ErrorLog;
};

int main(int argc, char* argv[])
{
    int i=0, j=0;
    struct Log **A = (struct Log**)malloc(4*sizeof(struct Log*));
    for (i=0; i<4; ++i)
    {
        A[i] = (struct Log*)malloc((i+1)*10*sizeof(struct Log));
        for (j=0; j<(i+1)*10; ++j)
        {
            A[i][j].Line = j;
            A[i][j].ErrorLog = NULL;
        }
    }

    for (i=0; i<4; ++i)
    {
        for (j=0; j<(i+1)*10; ++j)
            printf("%d ", A[i][j].Line);
        printf("\n");
    }
   
    for (i=0; i<4; ++i)
        free(A[i]);
    free(A);
    return 0;
}
2018-10-08 19:57
wube
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:16
帖 子:1729
专家分:3602
注 册:2011-3-24
  得分:7 
所以C可以让二维阵列的第二维长度自由变动
VB只能ReDim第一维的长度

不要選我當版主
7 天前 18:11
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:城市猎人
威 望:8
帖 子:1061
专家分:5053
注 册:2015-10-27
  得分:7 
回复 3楼 wube
C的数组是在声明之后就不能再做什么动态增减的。。。这里用的是链表。一维数组放单向链表表头,所以相当于第二维可以灵活增减。如果是做LR链表,就可以做成类似与二叉树那样的两个维度都可以自由扩展。

VB的Redim ,我记得好像是程序重新申请一块内存,然后把旧数组的数据复制过去,最后把标识符指向新的内存位置。由于每一次redim都要复制重写一遍所有数据,所以比较耗时间资源。运用这样的方法,你可以在C语言里面运用指针的特性自己写一个redim函数出来,然后你想扩展一维或者二维或者都扩展,都可以随意

φ(゜▽゜*)♪
7 天前 21:42







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

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