| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 748 人关注过本帖
标题:自学一段时间的C之后,出现了很多的疑问
只看楼主 加入收藏
飘青
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2012-7-8
结帖率:70.59%
收藏
已结贴  问题点数:10 回复次数:9 
自学一段时间的C之后,出现了很多的疑问
自学一段时间的C之后,出现了很多的疑问。。 希望各位大侠抬抬贵手。  感激不尽。。。

问题一: 数组数据是根据什么规则分配的内存的。
   一般情况下:我们“定义”一个变量(基本型 可以为 int char float等) 在源文件编译的时候就根据基本型来分配内存。
  但是数组 虽然我们定义了基本型   但是一个int型才为两个字节, 不太可能将一个数组的全部数据都存在这两个字节中把????

问题二:linux gcc 编译器的C库目录在什么地方
搜索更多相关主题的帖子: 疑问 编译器 源文件 
2012-07-30 22:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
呵呵,数组是什么概念,教材上没讲清楚?

授人以渔,不授人以鱼。
2012-07-30 23:04
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:2 
以下是引用飘青在2012-7-30 22:59:30的发言:

自学一段时间的C之后,出现了很多的疑问。。 希望各位大侠抬抬贵手。  感激不尽。。。

问题一: 数组数据是根据什么规则分配的内存的。
   一般情况下:我们“定义”一个变量(基本型 可以为 int char float等) 在源文件编译的时候就根据基本型来分配内存。
  但是数组 虽然我们定义了基本型   但是一个int型才为两个字节, 不太可能将一个数组的全部数据都存在这两个字节中把????

问题二:linux gcc 编译器的C库目录在什么地方

问题二:linux gcc 编译器的C库目录在什么地方

/usr/include 一般是在usr下 具体你去找找罢 我也忘了。。

但是一个int型才为两个字节

目前的32位或64位操作系统下 int一般相应的变为32位或64位变量 也就是4字节或8字节

问题一: 数组数据是根据什么规则分配的内存的。

对啊 一个int放不下 若干个不就放下了

int a[20] = {0};

也就是 分配了若干个(至少是20个)int的空间 而且是连续的

为啥我说是若干呢 不好说具体多少个 因为很多原因可能会比你指定的多 但若干个是肯定的

数组 其实就是若干个连续的相同类型的变量



[ 本帖最后由 zklhp 于 2012-7-30 23:10 编辑 ]
2012-07-30 23:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
时至今日,还有人学到int是两字节的知识,真是叹为观止。

授人以渔,不授人以鱼。
2012-07-30 23:11
飘青
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2012-7-8
收藏
得分:0 
谢谢
2012-07-30 23:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
估计不结题了
2012-07-31 00:28
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:2 
以下是引用TonyDeng在2012-7-30 23:11:46的发言:

时至今日,还有人学到int是两字节的知识,真是叹为观止。
的确有点惊为天人...我记得我上大一时TouboC就是16位的...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2012-07-31 08:24
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:2 
问题二:linux 下的 gcc 的执行库一般在 /usr/lib 下。是二进制文件 (gcc 里的不少函数,都是用汇编语言写的,精心优化过)。

如果你想研究具体的现实,得去下 gcc 的源代码。


[ 本帖最后由 pangding 于 2012-8-6 11:01 编辑 ]
2012-08-06 10:58
ly2222
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:217
专家分:618
注 册:2012-6-15
收藏
得分:2 
学习了
2012-08-06 11:07
zanzan1986
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:140
注 册:2011-2-22
收藏
得分:2 
在C语言中有内存分配管理的,如果没用malloc分配内存,真接的源代中声明变量数,那么它们的创建是在堆栈中的。

{
    int a[10];     //在堆栈中创建10个int变量
}
return 0;          //程序运行到这,堆栈指针回到未声明int a[10]的地址处。在用数组将会出错!
而在很多初学者的代码中很多有这样之类的声明 int a[1000],b[1000];我看得很恐怖


如果用malloc分配的内存,它是单独在内存中的,C语言有个内存管理的记录这个地址分配了多少空间
以后调用free()就直接找到分配的地址回收就可,

{
     int *a;
     a = (int*) malloc(10*sizeof(int));
     ............................
     free(a);
}
free(a) //如果将free函数放在这,将会出错,因为指针a是堆栈变量,前面以说的很清楚了。因为指针被释放了
        //在调用free函数a指针将不存在,在分配管理中找不到这个地址,

但如果这样呢????
typedef struct DATA              //结构A
{
    int i;
    char b;
}DATA,*PDATA;

typedef struct NUMBER{            //结构B
    int i;
    PDATA a;      //结构A的指针
}NUMBER,*PNUMBER;



void *p;
PDATA   a;         //A结构指针
PNUMBER  c;        //B结构指针


p = malloc(sizeof(NUMBER) + sizeof(DATA));      //分配两个相连的结构大小的内存
c = (PNUMBER) p;                         //在强行转换
c.a = (PDATA) (p + sizeof(NUMBER));      //取得A结构的地址
free(c.a);
free(c);
//这样做肯定会出错
//正确的应该这样free(p)或free(c)的其中一个这样很方便,在某些程序很好用,就如在将文件写入磁盘中


2012-08-06 13:00
快速回复:自学一段时间的C之后,出现了很多的疑问
数据加载中...
 
   



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

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