诡异的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 ...
随机推荐
- Race condition
在很多门课上都接触到race condition, 其中也举了很多方法解决这个问题.于是想来总结一下这些方法. Race condition 它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺 ...
- 初学redis,redis基本数据类型
String: 1. set key value 2. get key 3. del key 4. strlen key 5. getset key value 修改键值对 6. getrange ...
- GoF23种设计模式之行为型模式之解释器模式
一.概述 给定一种语言和其文法的一种表示,再定义一个解释器,该解释器使用表示来解释语言中的句子. 二.适用性 当需要解释一种语言,并且可以将该语言中的句子表示 ...
- spring关于@Autowired和@Qualifier的使用
// package com.jhc.model; import org.springframework.stereotype.Component; @Component public interfa ...
- 排序 sort函数
sort函数见下表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partia ...
- C++基础——1.变量和基本类型(基于c++11)
C++11类型 基本类型 字面值常量(literal) 比如:一个形如42的值,即为常量 变量 初始值 初始化不是赋值,初始化是创建变量的时候给一个初始值:而赋值是擦除当前值,用新值代替. 列表初始化 ...
- 全链路spring cloud sleuth+zipkin
http://blog.csdn.net/qq_15138455/article/details/72956232 版权声明:@入江之鲸 一.About ZipKin please google 二. ...
- 初学-BeautifulSoup爬取豆瓣页面
# -*- coding: utf-8 -*-import osimport urllibimport urllib2from bs4 import BeautifulSoup headers = { ...
- Nginx从入门到放弃-第4章 深度学习篇
4-1 Nginx动静分离_动静分离场景演示 4-2 Nginx动静分离_动静分离场景演示1 4-3 Nginx的动静分离_动静分离场景演示2 4-4 Rewrite规则_rewrite规则的作用 4 ...
- Facebook App 的头文件会有更多的收获
最近在看一些 App 架构相关的文章,也看了 Facebook 分享的两个不同时期的架构(2013 和 2014),于是就想一窥 Facebook App 的头文件,看看会不会有更多的收获,确实有,还 ...