诡异的malloc函数和%S的输出
输出 函数 malloc 诡异
2023-09-11 14:22:23 时间
今天测试代码过程中无意间发现,代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define SIZE 2 5 6 int main(int argc, char **argv) 7 { 8 char *s1 = "Hello, "; 9 char *s2 = "world!"; 10 char *s3 = (char*)malloc(SIZE * sizeof(char)); 11 12 printf("s1: %s\n", s1); 13 printf("s2: %s\n", s2); 14 strcpy(s3, s1); 15 strcat(s3, s2); 16 printf("s1: %s\n", s1); 17 printf("s2: %s\n", s2); 18 printf("s3: %s\n", s3); 19 20 return 0; 21 }
代码很简单,就是测试字符串的复制和连接,但是,无论第4行的代码中SIZE是多大,都可以出现如下结果:
s1: Hello,
s2: world!
s1: Hello,
s2: world!
s3: Hello, world!
感觉结果有点诡异,不是应该对指针的大小有要求的吗,怎么把指针外的东西也能输出呢。
以后分配内存就可以更加简单了,不需要设置大小了,自动识别大小的内存分配,代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 void getName(char *name){ 6 printf("the name: %s\n", name); 7 8 return; 9 } 10 11 char* setName(){ 12 char *name = (char*)malloc(sizeof(char)); 13 printf("please input your name: "); 14 scanf("%s", name); 15 16 return name; 17 } 18 19 int main(int argc, char **argv) 20 { 21 char *name = NULL; 22 name = setName(); 23 getName(name); 24 25 return 0; 26 }
代码结果为:
please input your name: zhangsan
the name: zhangsan
通过中间变量name指针,简单实现了java语言中的setter和getter,只不过是实现的思路稍微有点点变化而已。
代码如下:
1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 char cArray[] = "Hello, JJu!"; 6 //char cArray[20]; 7 //cArray = "Hello, JJu!"; 8 char *ptrArray= "Hello, World!"; 9 //*(ptrArray + 4) = 'e'; 10 printf("cArray: %s\n", cArray); 11 printf("*ptrArray: %s\n", ptrArray); 12 printf("char size: %d\n", sizeof(char)); 13 printf("'a' size: %d\n", sizeof('a')); 14 15 return 0; 16 }
这段代码有两怪:
1、很多人看到这段代码的第一感觉就是第5行与第6行和第7行的效果是一样的,你确定吗,不信运行下就知道了,是不一样的。
2、第12行的代码的结果是1, 第13行代码的结果是4,a是char,但是char不是a呀;
3、第9行代码,如果不注释掉,程序就不能编译通过,说明数组无论是用数组本身表示,还是使用指针表示都是不能更改的;
相关文章
- poj2987最大权闭包(输出最少建塔个数)
- POJ2337 欧拉路径字典序输出
- Java 方法使用总结(重载、数组输出、enum和switch、foreach和迭代器、可变长度参数、重载中使用可变长度参数)
- C语言之基本算法38—格式化输出10000以内的全部完数
- Python爬虫技术--基础篇--输入与输出语句
- 使用JavaScript输出语句的三种方式详解
- Android JNI编程(二)——C语言的基本数据类型,输出函数,输入函数
- shell使用标准输出返回函数值
- H3C tracert命令的输出
- 函数是什么:输入、输出、关系(联系)
- 鸿蒙基础之HiLog 输出日志的方法(HarmonyOS鸿蒙开发基础知识)
- STM32HAL 移植 EasyLogger 极简美开源打印文件日志输出(裸机开发神器)
- 【JAVA】生成10个1到20之间的不重复的随机数并降序输出
- 手把手教你搭建一个深度网络模型:从输入层-激活函数-损失函数-优化方法-输出层-执行训练
- Pandas中的DataFrame按指定顺序输出所有列的方法
- 输出cglib以及jdk动态代理产生的class文件
- 解决HttpServletResponse输出的中文乱码问题