在C中判断变量存储类型(字符常量/数组/动态变量)
在C中判断变量存储类型(字符常量/数组/动态变量)
在chinaunix论坛上有人问到关于变量存府类型的问题,我觉得可以写个测试代码加深大家对内存使用和布局的理解。下面我把原问题及处理办法贴出来,限供大家参考。
原问题:
![](https://common.cnblogs.com/images/copycode.gif)
static
void testB (char *src)
{
/* 判断传入的src 是属于 @1/2/3 ??? */
do_somthing ();
} static
void testA (char *src)
{
char *a = "hello world";
char b[100] = "hello world"; testB (a); /* @1 */
testB (b); /* @2 */
testB ("hello world" ); /* @3 */
}
![](https://common.cnblogs.com/images/copycode.gif)
@1 有名常量
@2 缓冲资源
@3 未名常量
怎么用宏去区别啊???
下面是对这个问题的处理办法:
编译器和语言并没有直观的提供什么功能去实现这个处理,可以换个思路,在C中有四个存储类型static,automatic,register,dynamic。每种类型的存储的地址都是可识别的,通过对存储地址的判断可以识别实事的变量或常量变型。
char *a = "hello world";testB (a); 和 testB ("hello world" ); 这两个调用实际上是一样的。编译器在处理的时候会把对hello world的变引指向相同的地方(编译器基本都这么进行优化处理,不属于标准规定)。根据上述说法那下面的公式成立:编译器对常量变量的内存处理策略+操 作系统的内存布局=可明确定位的内存识别。由于操作系统的内存布局因系统而定,编译器的实现也各有不同,所以就算得出结论要实现相关处理的代码也是很难进 行移植的。下面是完成相关功能的代码在linux下测试通过。
![](https://common.cnblogs.com/images/copycode.gif)
#include <stdlib.h>
#include <stdio.h>
#include <string.h> int global_dummy = 0;
static
void testB (char *src)
{
/* 判断传入的src 是属于 @1/2/3/4*/
int local_dummy = 0;
if( (unsigned long)src < (unsigned long )&local_dummy ){
//if( src > testB ){
if( (unsigned long )src < (unsigned long )&global_dummy ){
printf("string literal\n\n");
}
else if ( (unsigned long ) src > (unsigned long ) &global_dummy){
printf("malloc string\n\n");
}
//}
}
else
{
printf("array: stack\n\n");
}
}
static
void testA ()
{
char *a = "hello world";
char b[100] = "hello world";
char *c = malloc(100);
strcpy(c,a);
printf("char *a = \"hello world\";\n");
testB (a); /* @1 */
printf("char b[100] = \"hello world\";\n");
testB (b); /* @2 */
printf(" (\"hello world\" )\n");
testB ("hello world" ); /* @3 */
printf("char *c = malloc(100);\n");
testB (c ); /* @4 */
free(c);
} int main(int argc,const char** argv)
{
testA();
return 0;
}
![](https://common.cnblogs.com/images/copycode.gif)
程序的运行结果如下:
char *a = "hello world";
string literal
char b[100] = "hello world";
array: stack
("hello world" )
string literal
char *c = malloc(100);
malloc string
虽然没有处理和测试所有情况,但以述代码我觉得针对理解内存布局和变量使用问题已经足够了。
下面贴个linux下程序运行的内存布局图,可以加深对上述代码的理解
ps:这不是抄袭,是原创
在C中判断变量存储类型(字符常量/数组/动态变量)的更多相关文章
- python中判断变量的类型
python的数据类型有:数字(int).浮点(float).字符串(str),列表(list).元组(tuple).字典(dict).集合(set) 一般通过以下方法进行判断: 1.isinstan ...
- JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)
这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...
- 【react】利用prop-types第三方库对组件的props中的变量进行类型检测
1.引言--JavaScript就是一个熊孩子 1.1对于JSer们来说,js是自由的,但同时又有许多让人烦恼的地方.javascript很多时候就是这么一个熊孩子,他很多时候并不会像C和java ...
- Js中判断变量存不存在的问题
前面写过jquery对象存在与否的判断.现在谈下Js中判断变量存不存在的问题. 如果这样if(!a),当变量a在js中没有申明时,就会报错,那么接下去的代码将不会被执行.注意,这种判断只要变量申明过, ...
- JavaScript中判断整字类型最简洁的实现方法
这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...
- prop-types:该第三方库对组件的props中的变量进行类型检测
利用prop-types第三方库对组件的props中的变量进行类型检测
- Python如何判断变量的类型
Python判断变量的类型有两种方法:type() 和 isinstance() 如何使用 对于基本的数据类型两个的效果都一样 type() ip_port = ['219.135.164.245', ...
- js中判断对象具体类型
大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...
- C语言支持的四种变量存储类型
http://blog.csdn.net/zhandoushi1982/article/details/5425835 一)auto:auto称为自动变量(局部变量).局部变量是指在函数内部说明的变量 ...
随机推荐
- 批量执行SQL文件
原文:批量执行SQL文件 摘要:很多时候我们在做系统升级时需要将大量的.sql文件挨个执行,十分不方便.而且考虑到执行顺序和客服的操作方便性,能不能找到一种简单的方法来批量执行这些sql文件呢? 主要 ...
- Java小知识点学习--------数组和位运算小知识点
位运算符: >>>无符号右移运算符,无符号右移的规则和右移的规则同样,仅仅是在填充时,无论原来是正数还是负数都用0来补充. 数组: arr1=arr2; 此时两个数组变量都会同一时 ...
- QML Image得到的图片资源路径的详细信息
最近又开始了Qt5.在学习QML当地的资源总是越来越留念类似 " QML Image: Cannot open: qrc:///images/Blue hills.jpg "的错误 ...
- OpenSUSE 13.2安装Texlive2014+Texmaker+Lyx
(1)首先下载安装Texlive2014 地址:http://mirrors.ustc.edu.cn/CTAN/systems/texlive/Images/ 或直接下载: wget http://m ...
- 使用Windows2003创建FTP服务器 - 进阶者系列 - 学习者系列文章
现在有不少的FTP建设软件,比如Server-U软件.不过本文只介绍使用Windows2003来创建FTP服务器. 1. 打开控制面板的添加删除程序. 2. 打开 添加删除Windows组件 3. ...
- Entity Framework 丢失数据链接的绑定,在已绑好的EDMX中提示“Choose Your Data Connection”
早先做的一个练手的项目中, 使用到了Entity framework . 最近碰到一个问题,在edmx 里面选择“Update model from Database” 的时候提示了 “Choose ...
- 分析Java因为语言慢
Java在早期的(例JDK1.2一旦)这是很慢.也许是因为有很多的优化,以提高装置的版本号,Java这是越来越快,所以这是现在非常的Java和C/C++什么什么慢速争议. 我想我自己的理解.谈论的影响 ...
- 阿里云WinServer2008下配置IIS7支持php
先送一只法克鱿给百度,百度了n多的方法都或多或少有问题. 0.php安装包 php-5.2.1-Win32.zip 下载地址 http://pan.baidu.com/s/1pJuc8YZ 最开始是p ...
- zxing二维码扫描的流程简析(Android版)
目前市面上二维码的扫描似乎用开源google的zxing比较多,接下去以2.2版本做一个简析吧,勿喷... 下载下来后定位两个文件夹,core和android,core是一些核心的库,android是 ...
- ASP.NET MVC应用程序处理并发
为ASP.NET MVC应用程序处理并发 2014-05-14 08:37 by Bce, 694 阅读, 2 评论, 收藏, 编辑 这是微软官方教程Getting Started with Enti ...