(一)结构体指针定义

今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了。我先贴出来第一次写的代码以及gcc编译器下报的错误:

#include<stdio.h>
typedef struct
{
int a;
char str;
int b[5];
}St;
int main()
{
St * Ds;
Ds -> a = 5;
Ds -> str = 'a';
Ds -> b[5] = 2;
printf("a = %d\nc = %c\nb = %d\n",Ds->a,Ds->str,Ds->b[5]); St Ea;
Ea.a = 100;
Ea.str = 'B';
Ea.b[1] = 6;
printf("a = %d\nc = %c\nb = %d\n",Ea.a,Ea.str,Ea.b[1]);
return 0;
}

在linux gcc编译器下编译没有报错但是执行程序出现段错误,报错如下:

我们可以看到程序无法执行,而只定义St Ea结构体,执行下面的代码没有错误,当两个一起写时就出错。而之定义执行St* Ds结构体指针时执行程序时结果正确,但是同样会报段错误。因此在这里我们知道了St* Ds这个结构体指针应该有问题。

后来查找资料总算知道了错误的地方,结构体指针在定义时一定要给它分配内存,不过不分配内存那这个指针指向的内存就是不确定的,gcc编译器不允许这种情况出现,因此就会报段错误。修改程序如下所示,显示结果正常,注意代码中红色是修改过的程序:

#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int a;
char str;
int b[];
}St;
int main()
{
St * Ds;
Ds = (St *) malloc (sizeof(St));
Ds -> a = ;
Ds -> str = 'a';
Ds -> b[] = ;
printf("a = %d\nc = %c\nb = %d\n",Ds->a,Ds->str,Ds->b[]); St Ea;
Ea.a = ;
Ea.str = 'B';
Ea.b[] = ;
printf("a = %d\nc = %c\nb = %d\n",Ea.a,Ea.str,Ea.b[]);
return ;
}

编译程序,结果如下所示:

我们看到程序编译执行都正常。

在这里我们总结一下:今后在写从c代码时遇到指针的定义,一定要注意给它分配内存,如果不分配内存便会出错,在这里我们给结构体指针分配内存有两种方法,分别如下:

1、使用malloc给指针分配内存

St* Ds;
Ds = (St*)malloc(sizeof(St));

2、使结构体指针指向一个已经定义了的机构体。如下所示

St* Ds;
St Str_A;
Str_A.a = ;
Ds = &Str_A;

二、sizeof

sizeof的作用是在c语言中计算数据类型或者表达式所占的内存大小,注意它不是函数,sizeof是在程序编译时执行,而不是在等到程序执行时才执行。要使用sizeof需要包含添加头文件#include<stdilb.h>

计算结构体等变量使用sizeof时要注意给这个变量加小括号,不加就会出错;sizeof(变量);

最新文章

  1. 用Ghost进行备份还原
  2. Shader实例:扭曲,漩涡
  3. hadoop分布式存储(2)-hadoop的安装(毕业设计)
  4. js实现无限极分类
  5. showModalDialog 刷新问题,在页面中跳转问题
  6. jQuery 菜单
  7. Visual Studio(VS2012) Project&amp;(Solution) 虚拟文件夹 &amp; 物理文件夹
  8. Excel的python读写
  9. [开发笔记]-Windows Service服务相关注意事项
  10. Go语言博客
  11. PHP之路,Day1 - PHP基础
  12. C Statements
  13. JAVA异常处理之finally中最好不要使用return
  14. 使用CXF和spring搭建webService服务
  15. url中文参数乱码问题
  16. Pyhon全栈之路----数据类型
  17. VS2013编译报错error C4996: &#39;sprintf&#39;: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
  18. [daily][qemu][kvm] qemu增加减少CPUID
  19. Common Substrings POJ - 3415(长度不小于k的公共子串的个数)
  20. 我的第一个php扩展

热门文章

  1. recycleview中使用checkbox导致的重复选中问题
  2. Redis 安装 启动 连接 配置 重启
  3. ACM题目————二叉树最大宽度和高度
  4. Oracle字符集设置
  5. 多校5-MZL&#39;s Border 分类: 比赛 2015-08-05 21:28 7人阅读 评论(0) 收藏
  6. 内存恶鬼drawRect
  7. 2016年11月1日 星期二 --出埃及记 Exodus 19:17
  8. Apache+Tomcat+mod_jk负载均衡
  9. python学习笔记一 python入门(基础篇)
  10. LAMMP架构的企业级应用