C语言中结构体必须要初始化吗?
#include<stdio.h>
#include<stdlib.h>

struct stu
{
    int a;
    char b;
    float c;
    char arr[10];
};

int main(void)
{
    struct stu  st;
    //memset(st, 0, sizeof(st));
    printf("%d\n", st.a);

    return 0;
}

结构体在使用它时,必须要初始化吗,在声明完变量st后不是已经分配空间了吗?
直接输出其中的st.a为什么不行,虽然其中的只不确定。

1个回答

结构体虽然分配了空间,但是里面的成员的值是随机的,特别是如果里面有指针的话,如果不初始化而直接访问,则会造成读取非法的内存地址的错误。

学校里面的学生和专业程序员的区别在于,前者无知因此无畏。你要知道,开发程序中编写初始的代码花费1小时,那么维护这个代码需要3小时,调试代码排除错误需要花6小时。当你维护和调试不规范的代码而花费大量的时间精力的时候,你自然就明白预防性编程,也就是用规范编写代码来杜绝错误隐患,比起少写那么一行代码,有价值得多。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言关于结构体必须要初始化吗?
``` #include<stdio.h> #include<stdlib.h> struct stu { int a; char b; float c; char arr[10]; }; int main(void) { struct stu st; //memset(st, 0, sizeof(st)); printf("%d\n", st.a); return 0; } ``` 结构体必须要初始化吗?在声明完一个结构体变量后,不是已经在内存中申请了空间了吗,为啥不能够直接输出st.a必须要初始化,虽然不初始化里面的内容 不确定。
c语言结构体数组的跳跃初始化问题
在一个结构体数组里面,要对其中的部分变量赋值,可以用.+变量名。在Devc++中,我这样做,回报错,可是,我看有些人就可以这样。表示不解。![图片](https://img-ask.csdn.net/upload/201702/05/1486228005_372558.jpg)
C语言typedef结构体问题
typedef struct { uint bits; /* length in bits of modulus */ uchar modulus[MAX_RSA_MODULUS_LEN]; /* modulus */ uchar exponent[4]; /* public exponent */ } R_RSA_PUBLIC_KEY; 初始化这个结构体 const R_RSA_PUBLIC_KEY mtPosPPublicKey = { 1024,//128 "\xcf\xcc\xf7\xb4\xda\x91\x4d...", {0x00, 0x01, 0x00, 0x01}, }; 现在我定义了一个:uchar gbszPublicKey[256+1];它存放了"\xcf\xcc\xf7\xb4\xda\x91\x4d..."字符串。现在如何对这个结构体进行初始化?
C语言求助!!!写了一个返回结构体指针的函数,编译时总是提醒没有初始化q,但是初始化了。
下面是源码下载: http://pan.baidu.com/s/1dDhplwH 程序是用C语言写的,VS2013编译。 这是其中使用结构体的定义 ![图片说明](https://img-ask.csdn.net/upload/201511/12/1447288322_379494.png) 这是哈夫曼函数的定义 ![图片说明](https://img-ask.csdn.net/upload/201511/12/1447288344_669827.png)
指针结构体 的小问题 C语言
指针结构体 初始化时一定要 动态申请分配内存吗 比如 ![图片说明](https://img-ask.csdn.net/upload/201802/07/1518011220_712134.jpg) 哪个对呢 真的只要是个指针结构体 就要动态申请吗 有点糊涂了
C语言一个结构体指针的问题
我用一个子函数初始化了一个结构体并返回结构体的地址,但是却发现在主函数中输出的num和str字符串和子函数中输出的不一样,主函数中输出的内容更像是一些乱码,但是两个函数中的地址是一致的,这是哪儿出现什么问题了吗? 代码如下,大家可以测试一下(这个代码并没有实际意义,就是在练习结构体时候瞎写的) ``` #include <stdio.h> struct Test { int num; char str[20]; }; struct Test * function(); int main() { struct Test *p = function(); printf("address : %p\n", p); printf("num = %d\n", p->num); printf("str = %s\n", p->str); } struct Test * function() { struct Test test = { 10, "hello world" }; struct Test *p = &test; printf("num = %d\n", p->num); printf("str = %s\n", p->str); printf("address : %p\n", p); return p; } ``` 附上运行结果图: 第一行是子函数中的num 第二行是子函数中的str 第三行是子函数中返回的地址 第四行是主函数中接收到的地址 第五行是主函数中的num 第六行是主函数中的str ![图片说明](https://img-ask.csdn.net/upload/201705/21/1495334379_666758.png)
C语言 在函数里给结构体赋值
求懂的人解释一下,谢谢 代码意思是想在传结构体指针给函数,在函数里面改变结构体各项的值,运行结果为:a和b的值能改变,但到打印指针c的时候,程序报错 #include <stdio.h> struct stu { int a; int b; char *c; }; //给结构体s1初始化 void Fun(void *ptr) { char *s = (char *)malloc(10); s = "Hello World"; int *p = (int *)ptr; *p = 100; //value of a *(p+1) = 101; //value of b *(p+2) = s; //value of c,c is a pointer } int main() { struct stu s1; Fun(&s1); printf("s1.a value = %d \n",s1.a); printf("s1.b value = %d \n",s1.b); printf("s1.c value = %s \n",s1.c); return 0; }
初学者问一个关于c语言结构体的问题
结构体中指针和数组有什么不同? 我定义了这么一个结构体: struct word { char*word1; int line[1000]; }; struct word danci 然后用一个函数getword读取输入并给该结构体赋值,具体是怎么样就不写了 getword(danci,100); 然后 printf("%d",danci.line[0]); 但是这句报错了,原因是struct word danci没有初始化 但是我把结构体中int line[1000] 改为int*line再给line分配一个地址 则不会报错。 请问这是为什么???? 以下是getword函数的代码: int getword(struct word word,int lim) { int c,getch(void); void ungetch(int); char*w=word.word1; static int nline=1; while((c=getch())==' '||c=='\t') ; if(c!=EOF) *w++=c; if(c=='\n') ++nline; if(nline>MAXLINE) { printf("只能处理1000行以内的单词\n"); return EOF; } if(!isalpha(c)) { *w='\0'; return c; } for(;--lim>0;w++) if(!isalnum(*w=getch())) { *(word.line)=nline; ungetch(*w); break; } *w='\0'; return word.word1[0]; } getword用来读取输入中的单词,将其赋给结构体struct word中的char*word1,把单词所在的行数赋给int line[0]
C语言结构体循环赋值老是出现随机数。。
问题是这样的 本人大一 C语言课程设计 做一个运动员管理系统 部分代码如下 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> void search(); void enter(); void browse(); void save(); void add(); int load(int y); int exchange(int x); void Department(); void sex(); void project(); void rank(); void Score(); void name(); struct on{ int N;}z; struct department{ char departmentName[11]; char project[11]; int rank; int score;}department[10]; struct sportsMen{ char sportmenName[11]; char departmentName[11]; char sex[5]; char project[11]; int rank; int score;}sportMen[50]; struct score{ char departmentName[11]; int rank[10]; int scoreSum[10];}score[10],k; struct another{ char sportmenName[11]; char departmentName[11]; char sex[5]; char project[11]; int rank[10]; int score[4];}another[50]; int main(void) { int d;int k; enter(); k=z.N; for(d=0;d<k;d++) { printf("姓名:%s 性别:%s 部门:%s 项目:%s 名次:%d 得分:%d\n",sportMen[d].sportmenName,sportMen[d].sex, sportMen[d].departmentName,sportMen[d].project,&sportMen[d].rank,&sportMen[d].score); } } void enter()//输入函数 { int i,G,j; system("CLS"); printf("请输入你想要录入的运动员人数(0-50)?"); scanf("%d",&G); z.N=G; for(i=0;i<G;i++)//给sportMen赋值 { printf("姓名:");scanf("%s",sportMen[i].sportmenName); printf("性别:");scanf("%s",sportMen[i].sex); printf("部门:");scanf("%s",sportMen[i].departmentName); printf("项目:");scanf("%s",sportMen[i].project); printf("排名:");scanf("%d",&sportMen[i].rank); system("CLS"); } for(j=0;j<G;j++)//给sportMen中的score赋值 { switch(sportMen[j].rank) { case 1:if(sportMen[j].project=="aa"&&"bb"&&"cc")sportMen[j].score=7; else sportMen[j].score=5; break; case 2:if(sportMen[j].project=="aa"&&"bb"&&"cc")sportMen[j].score=5; else sportMen[j].score=3; break; case 3:if(sportMen[j].project=="aa"&&"bb"&&"cc")sportMen[j].score=3; else sportMen[j].score=2; break; case 4:sportMen[j].score=2; break; case 5:sportMen[j].score=1; break; default:sportMen[j].score=0; break; } } } 在利用for循环给结构体sportMen赋值时 不能输出想要的结果,排名和得分会出现随机数 请教各位我这段代码哪里有问题?`
把结构体当中学生成绩由高到低排序,为啥结果成绩显示不出了?
typedef struct Student { long num; char name[10]; char sex[4]; int age; int score; }StudentType; //命名结构体名 #define Maxsize 100 //宏定义 typedef StudentType DataType; //定义DataType为StudentType typedef struct { DataType List[Maxsize]; //存放数据的数组成员 int size; //记录数组当前个数的成员 }SeqList; //命名结构体名 void ListInitiate(SeqList *L) //初始化函数 { L -> size = 0; //定义初始数据元素个数 } int ListLength(SeqList L) { return L.size; //求数组当前元素个数 } int ListInsert(SeqList *L,int i,DataType x) //在位置参数i(0=<i<=size)前插入数据元素x函数 //插入成功时函数返回1,否则返回0 { int j; if(L -> size >= Maxsize) //程序健壮性 { printf("数组已满,无法插入!\n"); return 0; } else if(i < 0||i > L->size) { printf("位置参数i不合法!\n"); return 0; } else //插入数据元素 { for(j = L->size;j > i;j--) { L -> List[j] = L -> List[j-1]; //位置参数i后的元素向后移一位 } L -> List[i] = x; L -> size++; //当前元素个数加1 return 1; } } int ListGet(SeqList L,int i,DataType *x) //取数组第i位置的函数 //取到的数组的值传入x中,函数返回1时成功取出,返回0时取出失败 { if(i < 0||i > L.size-1) //程序健壮性 { printf("位置参数i不合法!\n"); return 0; } else { *x = L.List[i]; //取出的值放入x的地址中 return 1; } } void ListContrast(StudentType *L,int n) { int i,j,temp; int a[] = {L -> score}; for(i = 0;i < n;i++) { for(j = 0;j < n-1-i;j++) { /*if(L->score[j-1] < L->score[j]) { temp = L->score[j]; L->score[j] = L->score[j-1]; L->score[j-1] = temp; }*/ if(a[j-1] < a[j]) { temp = a[j]; a[j] =a[j-1]; a[j-1] = temp; } } } } ``` #include<stdio.h> #include"SeqList.h" void main(void) { SeqList myList; int i,k; StudentType str; StudentType x[3] = {{2000001,"张三","男",20,66}, {2000002,"李四","男",21,88}, {2000003,"王五","女",22,99}}; ListInitiate(&myList); //调用初始化函数 ListContrast(&str,3); for(i = 0;i < 3;i++) { if(ListInsert(&myList,i,x[i]) == 0) //调用插入函数 { printf("error!\n"); return; } } k = ListLength(myList); //调用求当前长度函数 for(i =0;i < k;i++) { if(ListGet(myList,i,&str) == 0) //调用取值函数 { printf("error!\n"); return; } else { printf("%d %s %s %d\n",str.num,str.name,str.sex,str.age);//输出数据 } } getchar(); getchar(); } ```
C语言pso粒子群算法的初始化以及对种群中适应度高的粒子筛选问题
int initialize(int id) { /*由当前时间产生随机数种子*/ srand((unsigned)time(NULL)+10*id); FILE *infile; /*初始化数据文件,记录坐标及速度上下限*/ int i, j; /*i:维度循环参数,j:粒子群循环参数*/ double lbound, ubound, Vlbound, Vubound; /*记录由初始化数据文件中读入的各维度坐标和速度上下限*/ char filename[256]; sprintf(filename,"initialdata%d",id); //printf("filename is %s\n",filename); if((infile = fopen(filename,"r"))==NULL) { fprintf(psolog,"\nCannot open input file!\n"); exit(1); } for(i=0;i<DIMENSION;i++) { /*读入各方向位置及速度上下限*/ fscanf(infile, "%lf", &lbound); fscanf(infile, "%lf", &ubound); fscanf(infile, "%lf", &Vlbound); fscanf(infile, "%lf", &Vubound); /*将速度上下限循环写入各粒子结构体中,并由之随机产生初始位置及速度*/ for(j=0;j<POPSIZE;j++) { particle[j].lowbound[i]=lbound; particle[j].upbound[i]=ubound; particle[j].low_V[i]=Vlbound; particle[j].up_V[i]=Vubound; particle[j].position[id][i]=randval(lbound, ubound); particle[j].velocity[id][i]=randval(Vlbound, Vubound); particle[j].fitness[id] = 0; } } fclose(infile); return 0; } int select1(int n) { double sum_fit,r_fitness; /*该种群当前最优适应度总和以及存储前mem个粒子适应度和的变量*/ int i,j,k; double p; /*记录随机数*/ sum_fit=0; for(i=0;i<POPSIZE;i++) { sum_fit+=particle[i].fitness[MAXSHIFT]; } for(i=0;i<POPSIZE;i++) { r_fitness=0; for(j=0;j<i+1;j++) { r_fitness+=particle[j].fitness[MAXSHIFT]; } particle[i].r_fit = r_fitness/sum_fit; } /*开始优选*/ for(i=0;i<POPSIZE;i++) { p=(double)(rand()%1000)/1000; if(p<particle[0].r_fit) { particle[i].fitness[n]=particle[0].fitness[n]; particle[i].fitness[MAXSHIFT]=particle[0].fitness[MAXSHIFT]; for(k=0;k<DIMENSION;k++) { particle[i].position[n][k] = particle[0].position[n][k]; particle[i].velocity[n][k] = particle[0].velocity[n][k]; particle[i].position[MAXSHIFT][k] = particle[0].position[MAXSHIFT][k]; particle[i].velocity[MAXSHIFT][k] = particle[0].velocity[MAXSHIFT][k]; } } for(j=1;j<POPSIZE;j++) { if((p>particle[j-1].r_fit)&&(p<particle[j].r_fit)) { particle[i].fitness[n]=particle[j].fitness[n]; particle[i].fitness[MAXSHIFT]=particle[j].fitness[MAXSHIFT]; for(k=0;k<DIMENSION;k++) { particle[i].position[n][k] = particle[j].position[n][k]; particle[i].velocity[n][k] = particle[j].velocity[n][k]; particle[i].position[MAXSHIFT][k] = particle[j].position[MAXSHIFT][k]; particle[i].velocity[MAXSHIFT][k] = particle[j].velocity[MAXSHIFT][k]; } } } } }
C语言 结构体类型的问题 涉及到二叉树及循环队列
//声明结构体类型 typedef struct node { char ch; struct node *lchild; struct node *rchild; }TreeNode,*Tree; //利用循环队列层次遍历 void Show_level(Tree T) { Tree q[MAX]; //队列 Tree p; //当前结点 int front; int rear; //初始化 front =0; rear =0; if(T) { q[rear] = T; rear = (rear+1)%MAX; } while(front != rear) { p = q[front]; printf("%c ",p->ch); if(p->lchild) { q[rear] = p->lchild; rear = (rear+1)%MAX; } if(p->rchild) { q[rear] = p->rchild; rear = (rear+1)%MAX; } front = (front+1)%MAX; } } > q[rear] = T; 这一行代码怎么理解? 我的理解是:Tree类型变量T存入数组q[0]中,T->ch即是根结点的数据域,所以这一句可表示将头结点的数据域存储在q[0]中。我的理解有错吗?
刚刚初学C# 萌新问题
如何定义一个学生结构体,成员属性包含,姓名,年龄,性别和班级,使用结构体数组初始化3名学生,通过for循环输出学生全部信息. 并输出年龄最大学生的名字以及班级
C语言 Union和Struct成员赋值问题
``` #include "pch.h" #include <iostream> #include <bitset> using namespace std; typedef struct { union { uint32_t _32; uint16_t _16; uint8_t _8[2]; }gpr[8]; uint32_t eax = gpr[0]._32; uint32_t ecx = gpr[1]._32; }CPU_State; int main() { CPU_State cpu; //先测试gpr0和gpr2 //随便写的数据 cpu.gpr[0]._32 = 0xabcdf1f0; cpu.gpr[1]._32 = 0xabcdf1f1; //现在只能输出未初始化的数据 //我的电脑输出cccccccc和cccccccc cout << hex << cpu.eax << endl; cout << hex << cpu.ecx << endl; } ``` 我现在给gpr[0]._32和gpr[1]._32赋值。 现在输出的eax和ecx的值是错的。 我想把eax和ecx的值关联与gpr[0]._32和gpr[1]._32。 限定只能修改结构体的定义。 请问我该如何更改CPU_State这个结构体的定义,使得eax,ecx的值分别等于gpr[0]._32和gpr[1]._32。
C语言小白实现记录学校人员信息:代码如下,为什么在scanf输入第一个人员数据后按回车不能输入下一个人员数据而是程序结束?
``` #include<stdio.h> /*实现记录学校人员信息,包括学生和老师,其中信息包含身份、姓名、性别、职务/班级*/ #include<stdlib.h> struct Position /*结构体变量定义班级或职务*/ { int iClass; char cStaff[]; }; union Membership /*共用体变量定义成员信息*/ { char cStatus[]; char cName[]; int iNumber; char cSex[]; int iGo; /*作为判断是否继续的依据*/ struct Position Text; /*共用体中引用结构体*/ union Membership* pNext; /*指向下一个结点指针*/ }; int iCount; /*定义全局链表长度*/ union Membership* Create() { union Membership *pHead=NULL; /*头指针初始化为空*/ union Membership *pNew, *pEnd; iCount=0; /*链表长度初始化为0*/ pNew=pEnd=(union Membership*)malloc(sizeof(union Membership)); /*创建动态链表*/ printf("请输入学校人员信息:\n"); /*提示信息*/ printf("身份 姓名 编号 性别 职务 班级 是否继续\n"); scanf("%s",&pNew->cStatus); /*输入信息*/ scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); scanf("%s",&pNew->cSex); scanf("%d",&pNew->Text.iClass); scanf("%s",&pNew->Text.cStaff); scanf("%d",&pNew->iGo); while(&pNew->iGo!=0); /*判断语句是否进行*/ { iCount++; if(iCount==1) { pNew->pNext=pHead; /*使指向为空*/ pEnd=pNew; /*跟踪新加入的结点*/ pHead=pNew; /*头指针指向首结点*/ } else { pNew->pNext=NULL; /*新结点的指针为空*/ pEnd->pNext=pNew; /*原来的尾结点指向新结点*/ pEnd=pNew; /*pEnd指向新结点*/ } pNew=(union Membership*)malloc(sizeof(union Membership)); /*再次分配节点内存空间*/ scanf("%s",&pNew->cStatus); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); scanf("%s",&pNew->cSex); scanf("%d",&pNew->Text.iClass); scanf("%s",&pNew->Text.cStaff); scanf("%d",&pNew->iGo); } free(pNew); /*释放无用空间*/ return pHead; } void Print(union Membership* pHead) { union Membership *pTemp; /*定义临时指针*/ int iIndex=1; /*定义结点序号*/ printf("数据库中共有%d个人\n",iCount); printf("\n"); pTemp=pHead; /*指针得到首结点地址*/ while(pTemp!=NULL) { printf("第%d个人员信息如下:\n"); printf("身份:%s\n",pTemp->cStatus); printf("姓名:%s\n",pTemp->cName); printf("编号:%d\n",pTemp->iNumber); printf("性别:%s\n",pTemp->cSex); printf("班级:%d",pTemp->Text.iClass); printf("职务:%s\n",pTemp->Text.cStaff); printf("\n"); pTemp=pTemp->pNext; /*移动临时指针到下一个结点*/ iIndex++; } } int main() { union Membership *pHead; /*定义头结点*/ pHead=Create(); /*创建结点*/ Print(pHead); /*输出链表*/ return 0; /*程序结束*/ } ```
修改程序:信源编解码(c语言)
修改程序:问题1。源文件source文本空间太长汉字太多无法运行2,未按频度要求排序 问题描述: 信源编解码是通信系统的重要组成部分。本实验旨在通过程序设计实现基于哈夫曼编码的信源编解码算法。程序具备以下功能: 对于给定的源文档 SourceDoc.txt, 1) 统计其中所有字符的频度(某字符的频度等于其出现的总次数除以总字符数) , 包括字母(区分大小写) 、标点符号及格式控制符(空格、回车等) 。 2) 按频度统计结果生成哈夫曼编码码表。 3) 基于哈夫曼码表进行编码,生成对应的二进制码流,并输出到文件 Encode.dat。 4) 对二进制码流进行哈夫曼解码,把结果输出到文件 DecodeDoc.txt。 5) 判断DecodeDoc.txt与SourceDoc.txt内容是否一致,以 验证编解码系统的正确性。 要求: 1) 用 C 语言实现。 2) 用子函数实现各功能模块。 3) 输出文件 Statistic.txt,包含的信息有:按频度大小排序的字符表,及各字符出现 的次数、频度及哈夫曼编码。 4) 应至少包含链表、二叉树的数据结构。 5) 不能用冒泡排序算法。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #define N 10000 int count = 0; //每增加一个新的字符, count增加1, 可表示a中的字符种类数, 也即哈夫曼树叶子点个数 /*定义哈夫曼树结构体*/ typedef struct HuffmanTree{ int weight; int parent; int Lchild; int Rchild; }HuffmanTree[2*N]; /*定义储存字符及其出现次数的结构体*/ typedef struct DifferentCharacter{ char char_date; int num; //相同字符出现的次数 char a_code[100]; //每种字符对应的编码 }difcha[N]; /*在一定范围内选择两个weight最小的结点, 并将两个结点的序号赋给s1, s2*/ void select_two(HuffmanTree ht, int j, int *s1, int *s2) { int i = 1, temp; int min1 = 0, min2 = 0; while( (ht[i].parent != 0) && (i <= j) ) i++; *s1 = i; min1 = ht[i++].weight; while( (ht[i].parent != 0) && (i <= j) ) i++; *s2 = i; min2 = ht[i++].weight; if(min1 > min2){ temp = min1; min1 = min2; min2 = temp; } for(; i <= j; i++){ //遍历parent不为0的结点 if(ht[i].parent != 0) continue; if(ht[i].weight <= min1){ min2 = min1; min1 = ht[i].weight; *s2 = *s1; *s1 = i; } else if( (ht[i].weight < min2) && (ht[i].weight > min1) ) { min2 = ht[i].weight; *s2 = i; } } } /*建哈夫曼树*/ void EstHuffmanTree(HuffmanTree ht, int *w, int n){ int i; int s1 = 0, s2 = 0; for(i = 1; i <= n; i++){ //初始化哈夫曼树, 前n个单元存放叶子点 ht[i].weight = w[i]; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ //后n-1个单元存放非叶子点 ht[i].weight = 0; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ select_two(ht, i-1, &s1, &s2); //创建非叶子点, 建立哈夫曼树, 每次在ht[1]~ht[i-1]范围内选两个最小的weight结点,并将其序号赋给s1, s2 ht[i].weight = ht[s1].weight + ht[s2].weight; ht[i].Lchild = s1; ht[i].Rchild = s2; ht[s1].parent = i; ht[s2].parent = i; } //哈夫曼树建立完毕 } /*求哈弗曼编码*/ void CrtHuffmanCode(HuffmanTree ht, char **hcd, int n){ int start = 0, c = 0, p = 0, i; char *cd = (char*)malloc(n*sizeof(char)); //分配求当前编码的工作空间 cd[n-1] = '\0'; //从左向右存放编码 for(i = 1; i <= n; i++) { start = n-1; //初始化编码起始指针 c = i; p = ht[i].parent; while(p != 0){ start--; if(ht[p].Lchild == c) cd[start] = '0'; //左分支标0 else cd[start] = '1'; //右分支标1 c = p; //向上倒推 p = ht[c].parent; } hcd[i] = (char*)malloc((n-start)*sizeof(char)); strcpy(hcd[i], &cd[start]); } free(cd); } /*自定义错误处理函数*/ void my_err(char *err_string, int line){ printf("Line %d:\n", line); perror(err_string); exit(1); } /*从 buf_read 中统计每个字符出现的次数,将次数作为该字符的权值*/ void Statistics(difcha a, char *buf_read){ int i, j = 0; for(i = 0; i < strlen(buf_read) ; i++){ //对buf_read中的字符遍历 for(j = 0; j < count; j++){ //检查是否是新的字符 if(a[j].char_date == buf_read[i]){ a[j].num++; //若是旧字符, 则num++; break; } } if(j == count){ //若是新字符, 则记录到a中, 且对应的num++ a[count].char_date = buf_read[i]; a[count].num++; count++; //更新count } } } /*从 SourceDoc.txt 读取数据到 buf_read */ void ReadFile(char *pathName, char *buf_read){ int fd_date; int len = 0; if( (fd_date = open(pathName, O_RDWR)) < 0) //以读写方式打开SourceDoc.txt文件 my_err("open SourceDoc.txt", __LINE__); if(lseek(fd_date, 0, SEEK_END) < 0) //获取文件长度,并保持文件读写指针在文件开始处 my_err("lseek", __LINE__); if( (len = lseek(fd_date, 0, SEEK_CUR)) < 0 ) my_err("lseek", __LINE__); if(lseek(fd_date, 0, SEEK_SET) < 0) my_err("lseek", __LINE__); if(read(fd_date, buf_read, len) > len) //从SourceDoc.txt中读取内容 my_err("read SourceDoc.txt", __LINE__); } /*将 buf_code 写入 Encode.dat 中*/ void WriteFile(char *pathName, char *buf_code){ int fd_code; if((fd_code = open(pathName, O_CREAT|O_TRUNC|O_RDWR, S_IRWXU)) < 0) //创建Encode.dat文件 my_err("open Encode.dat", __LINE__); if( write(fd_code, buf_code, strlen(buf_code)) != strlen(buf_code) ) //将 buf_code 写入Encode.dat my_err("write Encode.dat", __LINE__); } /*主函数*/ void main(){ char buf_read[N] = {'\0'}; char buf_code[N] = {'\0'}; char buf_yima[N] = {'\0'}; char *hcd[N]; char temp[50] = {'\0'}; difcha a; int i, j, n, k = 0, m = 0; int w[N] = {0}; HuffmanTree ht; ReadFile("SourceDoc.txt", buf_read); Statistics(a, buf_read); for(i = 0; i < count; i++) w[i+1] = a[i].num; EstHuffmanTree(ht, w, count); //建HuffmanTree CrtHuffmanCode(ht, hcd, count); //对树中字符进行编码 for(i = 1; i <= count; i++) //将每个字符对应的编码存入结构体 a 中 strcpy(a[i-1].a_code, hcd[i]); FILE *fp1; fp1=fopen("Statistic.txt","w"); for(i = 0; i < count; i++) //查看每个字符的权值和对应的编码 fprintf(fp1,"%c %d %s\n", a[i].char_date, a[i].num, a[i].a_code); fclose(fp1); for(i = 0; i < strlen(buf_read) ; i++){ //遍历 buf_read, 给 SourceDoc.txt 中每个字符匹配编码, 存入 buf_code 中 for(j = 0; j < count; j++){ if(buf_read[i] == a[j].char_date){ strcat(buf_code, a[j].a_code); break; } } if(j == count) //匹配异常 printf("Unknown Character: %c\n", buf_read[i]); } WriteFile("Encode.dat", buf_code); //将 buf_code 写入 Encode.dat 中 ReadFile("Encode.dat", buf_read); //从 Encode.dat 中读取全部编码 n = strlen(buf_read); for(i = 0; i < n; i++){ //为 Encode.dat 中的编码匹配字符 temp[k++] = buf_read[i]; for(j = 0; j < count; j++){ if(strcmp(temp, a[j].a_code) == 0){ buf_yima[m++] = a[j].char_date; break; } } if(j < count){ //匹配成功, 对 temp 初始化 for(;k > 0; k--) temp[k] = '\0'; } } FILE *fp2; fp2=fopen("DecodeDoc.txt","w"); fprintf(fp2,"%s", buf_yima); fclose(fp2); }
C语言 struct结构体 发现的一个问题 百思不得其解,求大神为我解惑
# 代码如下 ``` #define _CRT_SECURE_NO_WARNINGS//vs报scanf警告 #include<stdio.h> #include<string.h> struct Student { char name[20]; char age; char sex; }; int main() { struct Student st[] = { {"aaa",25,1},{"bbb",40,0}, {"ccc",30,1},{"ddd",34,1},{"eee",79,0} };//声明且初始化 int num = sizeof(st) / sizeof(st[0]);//计算出成员数量 printf("%d\n", sizeof(st));//这里输出结构体数组st所占的内存大小,这里是110byte,5个成员,每个成员22byte for (int i = 0; i < num; i++)//冒泡排序,以年龄排序 { for (int j = 0; j < num - i; j++) { if (st[j].age > st[j + 1].age) { st[num] = st[j];//这里我突发奇想把大的放置在数组后面,程序运行起来没问题,不知道实际上能不能这样??? st[j] = st[j + 1]; st[j + 1] = st[num]; } } } scanf("%20s", st[5].name);//向数组添加新成员 scanf("%d", &st[5].age); scanf("%d", &st[5].sex); num = sizeof(st) / sizeof(st[0]);//问题来了!这里怎么还是5,不是6呢????那怎么输出新成员的信息呢??? printf("%d\n", sizeof(st)); for (int i = 0; i < num;i++) { printf("%s,%d,%d\n", st[i].name, st[i].age, st[i].sex); } return 0; } ```
C语言关于结构体传参的一点疑问(希望帮忙调一个小代码)
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 4 typedef struct list{ char name[5]; long num; long tell; char address[5]; int math; int C; }LIST; LIST stu[N]; void test(); int total[N]; int main(){ int j; test(); for (j=0;j<N;j++){ total[j]=stu[j].C+stu[j].math; } void xian(LIST P[N],int a[N]); xian(stu,total); return 0; } void test(){/*测试初始化*/ LIST stu01[4] = { {"李",201455,15079852222,"重庆",97,89}, {"张",201456,15073852222,"上海",97,95}, {"i",201457,15079886222,"松江",85,89}, {"李",201458,15079852962,"重庆",93,79} }; memcpy(&stu[0],&stu01[0],sizeof(stu01)*4); } void xian(LIST P[N],int a[N]){/*显示*/ int i; for (i=0;i<N;i++){ printf("\n"); printf("%s\t",P[i].name); printf("%ld\t",P[i].num); printf("%ld\t",P[i].tell); printf("%s\t",P[i].address); printf("%d\t",P[i].math); printf("%d\t",P[i].C); printf("%d\t",a[i]); printf("%d\t",a[i]/2); } }
为什么尾插法循环链表在插入时会出错?
调试时发现插入函数在调用时没有响应,百思不得其解。 ``` #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> //结构体定义 typedef struct node { int x; int y; struct node *next; }Node,*Snack; //所用函数 void initsnack(Snack s); void insert_node(Snack s,int x,int y);//问题所在函数 void show(Snack s); int main() { Snack s; initsnack(s); insert_node(s,12,17); insert_node(s,15,16); show(s); } void initsnack(Snack s) { //初始化蛇身并赋值 带尾指针循环链表 s=(Node*)malloc(sizeof(Node)); s->next=s; printf("OK1\n"); } void insert_node(Snack s,int x,int y) { //插入节点 Snack p=(Node *)malloc(sizeof(Node)); if(!p) printf("overflow"); p->x=x; p->y=y; s->next=p;//调试时显示程序到这儿就不往下进行了,为什么啊? p->next=s; s=p; free(p); printf("OK2\n"); } void show(Snack s) { //显示函数 Snack p=(Snack)malloc(sizeof(Node)); p=s->next; while(p->next!=s->next) { p=p->next; printf("x=%d,y=%d\n",p->x,p->y); } } ```
推荐 130 个令你眼前一亮的网站,总有一个用得着
总结了大学生活两年来,发现的 130 余个黑科技网站,总有一个会让你眼前一亮,赶紧收藏!
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
我在支付宝花了1分钟,查到了女朋友的开房记录!
在大数据时代下,不管你做什么都会留下蛛丝马迹,只要学会把各种软件运用到极致,捉奸简直轻而易举。今天就来给大家分享一下,什么叫大数据抓出轨。据史料证明,马爸爸年轻时曾被...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Flutter 会不会被苹果限制其发展?
这个可能性是存在的,而且不止是 flutter、react-native 、weex 、uni-app 、taro 、Hippy等都存在这个风险,虽然有些框架对比起 flutter 其他框架存在时间稍长,但是这不可否认它们一直都存在这个风向。 只要不是平台自己的亲儿子,那么肯定存在被限制发展的风险,所以这件事上是风险和收益之间的博弈,这是一个“后妈和前任之间的太极。” 先说现状 如今各大平台,如:...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
Linux必懂知识大总结(补)
关机 1. 数据同步写入磁盘 sync 为了加快对磁盘上文件的读写速度,位于内存中的文件数据不会立即同步到磁盘上,因此关机之前需要先进行 sync 同步操作。 2. shutdown # /sbin/shutdown [-krhc] [时间] [警告讯息] -k : 不会关机,只是发送警告讯息,通知所有在线的用户 -r : 将系统的服务停掉后就重新启动 -h : 将系统的服务停掉后就...
立即提问