-
- 2014-04-21
对C语言中的static关键字的深入理解
在阅读一些项目源代码时,我发现很多时候,会把函数和变量声明为static,所以,很好奇为什么要这样做,于是有了下面这篇文章。
基本概念
使用static有三种情况:
- 函数内部static变量
- 函数外部static变量
- static函数
函数内部的static变量,关键在于生命周期持久,他的值不会随着函数调用的结束而消失,下一次调用时,static变量的值,还保留着上次调用后的内容。
Read More ... -
- 2014-03-06
C语言中的int类型的范围是由什么决定的
在 K&R 经典教材 The C Programming Language 的2.2节中,对 int 类型是这样描述的
an integer, typically reflecting the natural size of integers on the host machine
意思是反映了机器整数类型的 natural size,可是,
这个 natural size 又是什么意思呢?
书中后来在谈到 short, int, long 的关系时,又说,这些类型由编译器根据机器自由选择合适的大小,但是 short 和 int 至少 16 位,long 至少 32 位。
这里的问题是
编译器是根据什么决定类型大小呢?
后面书中又提到,这些类型啊,在
<limits.h>
中都有,我就在ubuntu下查看了/usr/include/limits.h
,里面确实提到/* Minimum and maximum values a `signed int' can hold. */ # define INT_MIN (-INT_MAX - 1) # define INT_MAX 2147483647
但是,这也是一种定义,还是没有说出为什么,我现在想知道的是
为什么
-
- 2013-10-25
字符指针与字符数组真正的区别
问题缘起
先看一个示例
示例1
#include <stdio.h> int main() { char *p = "hello"; char q[] = "hello"; printf ("p: %s\n", p); printf ("q: %s\n", q); return 0; }
上面的例子会给出这样的输出
p: hello q: hello
这样看,
char *p
和char q[]
好像没什么区别, 那么我们再看一个例子示例2
#include <stdio.h> int main() { char *p = "hello"; char q[] = "hello"; p[0] = 's'; q[0] = 's'; return 0; }
如果你在Linux下,运行时可能得到这样的结果
Segmentation fault (core dumped)
这时候你看到了区别,出现了段错误, 你一定想明白,到底发生了什么, 经过几个小实验,你可能会发现使用
char *p
定义时,p指向的数据是无法改变的。 然后你Google, 别人可能会告诉你- char 指针指向的数据不能修改
- char 指针指向的数据没有分配
- ...
你听了还是一头雾水,不能修改是什么意思,没有分配?没有分配为什么能输出?
作为一个好奇心很重的人,你是绝对不能容忍这些问题的困扰的,且听我慢慢道来
Read More ...