诡异的malloc函数和%S的输出

  今天测试代码过程中无意间发现,代码如下:  

 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行代码,如果不注释掉,程序就不能编译通过,说明数组无论是用数组本身表示,还是使用指针表示都是不能更改的;

转载于:https://www.cnblogs.com/guochaoxxl/p/6927226.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值