诡异的malloc函数和%S的输出
今天测试代码过程中无意间发现,代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 2 int main(int argc, char **argv)
{
char *s1 = "Hello, ";
char *s2 = "world!";
char *s3 = (char*)malloc(SIZE * sizeof(char)); printf("s1: %s\n", s1);
printf("s2: %s\n", s2);
strcpy(s3, s1);
strcat(s3, s2);
printf("s1: %s\n", s1);
printf("s2: %s\n", s2);
printf("s3: %s\n", s3); return ;
}
代码很简单,就是测试字符串的复制和连接,但是,无论第4行的代码中SIZE是多大,都可以出现如下结果:
s1: Hello,
s2: world!
s1: Hello,
s2: world!
s3: Hello, world!
感觉结果有点诡异,不是应该对指针的大小有要求的吗,怎么把指针外的东西也能输出呢。
以后分配内存就可以更加简单了,不需要设置大小了,自动识别大小的内存分配,代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h> void getName(char *name){
printf("the name: %s\n", name); return;
} char* setName(){
char *name = (char*)malloc(sizeof(char));
printf("please input your name: ");
scanf("%s", name); return name;
} int main(int argc, char **argv)
{
char *name = NULL;
name = setName();
getName(name); return ;
}
代码结果为:
please input your name: zhangsan
the name: zhangsan
通过中间变量name指针,简单实现了java语言中的setter和getter,只不过是实现的思路稍微有点点变化而已。
代码如下:
#include <stdio.h> int main(int argc, char **argv)
{
char cArray[] = "Hello, JJu!";
//char cArray[20];
//cArray = "Hello, JJu!";
char *ptrArray= "Hello, World!";
9 //*(ptrArray + 4) = 'e';
printf("cArray: %s\n", cArray);
printf("*ptrArray: %s\n", ptrArray);
printf("char size: %d\n", sizeof(char));
printf("'a' size: %d\n", sizeof('a')); return ;
}
这段代码有两怪:
1、很多人看到这段代码的第一感觉就是第5行与第6行和第7行的效果是一样的,你确定吗,不信运行下就知道了,是不一样的。
2、第12行的代码的结果是1, 第13行代码的结果是4,a是char,但是char不是a呀;
3、第9行代码,如果不注释掉,程序就不能编译通过,说明数组无论是用数组本身表示,还是使用指针表示都是不能更改的;
诡异的malloc函数和%S的输出的更多相关文章
- malloc函数及用法
动态存储分配在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变.C语言中不允许动态数组类型.例如:int n;scanf("%d",&n);int a[n ...
- [Android Memory] Linux下malloc函数和OOM Killer
http://www.linuxidc.com/Linux/2010-09/28364.htm Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请 ...
- C语言中malloc函数的使用方法
C语言中malloc是动态内存分配函数.函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数.返回值:如果分 ...
- malloc函数、calloc函数和free函数
malloc函数和free函数 malloc函数原型:void *malloc(long NumBytes) malloc原型说明:mallco函数在堆分配了NumBytes个字节的内存空间,用来存放 ...
- C++ malloc()函数的注意点及使用示例
1.malloc()函数的头文件是stdlib.h,其函数声明如下: void* malloc(size_t size); 其中参数size_t size表示动态内存分配空间的大小,以字节为单位. s ...
- 关于malloc函数的动态分配问题
malloc函数动态分配了一个整型的内存空间,让abc都指向刚申请的空间,所以只有最后一个赋值语句的值保留在了空间里 #include<stdio.h> main() { int *a,* ...
- malloc 函数工作机制(转)
malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将 ...
- malloc函数详解
一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...
- malloc 函数到底做了什么?
请看下面的代码. 猜测结果是什么?编译通过吗? #include <stdio.h> #include <stdlib.h> int main() { ; char *ptr ...
随机推荐
- iOS监听电话来电、挂断、拨号等
以下,来讲解在app内如何调用打电话功能和监听电话来电.挂断.拨号等功能. 简单的UI布局: 首先,先实现拨打电话的功能,以便于后续测试: // 拨打电话 - (IBAction)dialingBut ...
- json_decode()和json_encode()区别----2015-0929
json_decode对JSON格式的字符串进行编码而json_encode对变量进行 JSON 编码,需要的朋友可以参考下 1.json_decode() json_decode (PHP 5 ...
- NOIP模拟赛 不等数列
[题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有k个“<”.答案对2012取模. [输入格式] 第一行 ...
- poj1654 Area
题目描述: vjudge POJ 题解: 本以为是水题结果是神题 计算几何求多边形面积. 考虑到结果一定是整数或者整数/2,我们应该用long long 来存…… 用double会死…… 还有日常只能 ...
- CentOS7下systemd
配置文件: /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/ /run/systemd/system:系统执行过程中所产生的服务脚本, ...
- 02 Django框架基础(APP的创建访问)
一.创建项目 1.命令:django-admin startproject sitename 2.IDLE环境:本质上都是执行上述命令 常用命令: python manage.py runserver ...
- json.dumps ensure_ascii 方法
在使用json.dumps时要注意一个问题 import json print (json.dumps('中国')) "\u4e2d\u56fd" 输出的会是 '中国' 中 ...
- Java-basic-7-面向对象
继承 在Java中,每个子类只能有一个父类,但可以继承多个接口. 子类继承父类,类定义的时候用extends. 继承接口,用implements. 重写 声明为final的方法不能被重写. 声明为st ...
- console_init()分析
启动阶段初始化控制台流程分析, start_kernel console_init(); -->tty_ldisc_begin(); /* Setup the default TTY line ...
- Linux集群之高可用负载均衡lvs+keepalived
LVS简介 LVS介绍 LVS是Linux Virtual Server的缩写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,属于4层负载均衡 ipvs和ipvsadm的关系 我们使用配置LV ...