• 诡异的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
    ", s1);
    13     printf("s2: %s
    ", s2);
    14     strcpy(s3, s1);
    15     strcat(s3, s2);
    16     printf("s1: %s
    ", s1);
    17     printf("s2: %s
    ", s2);
    18     printf("s3: %s
    ", 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
    ", 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
    ", cArray);
    11     printf("*ptrArray: %s
    ", ptrArray);
    12     printf("char size: %d
    ", sizeof(char));
    13     printf("'a' size: %d
    ", sizeof('a'));
    14
    15     return 0;
    16 }

      这段代码有两怪:

      1、很多人看到这段代码的第一感觉就是第5行与第6行和第7行的效果是一样的,你确定吗,不信运行下就知道了,是不一样的。

      2、第12行的代码的结果是1, 第13行代码的结果是4,a是char,但是char不是a呀;

      3、第9行代码,如果不注释掉,程序就不能编译通过,说明数组无论是用数组本身表示,还是使用指针表示都是不能更改的;

  • 相关阅读:
    SQL CREATE DATABASE 语句
    SQL SELECT INTO 语句
    SQL UNION 和 UNION ALL 操作符
    复盘实战营一期毕业典礼----HHR计划----以太入门课--第一课
    抑郁研究所融资历程分享--以太一堂--直播课
    投资人分享答疑----HHR计划----以太直播课第三课
    重新理解《务实创业》---HHR计划--以太一堂第三课
    HHR计划---作业复盘-直播第三课
    电影推荐算法---HHR计划
    一堂优秀学员吕智钊分享----HHR计划----直播课第二课
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6927226.html
Copyright © 2020-2023  润新知