zoukankan      html  css  js  c++  java
  • 字符串赋值注意事项

    1.字符串指针变量赋值

    #include<stdio.h>
    int main(){
            char *b="azzzxxxddd";
            b="azzzxxxdddccccc";
           printf("%s", b);
            system("pause");
            return 0;
    }

    结果:没有报错,b赋值成功,正常输出。

    原因分析:这里为什么没有内存溢出呢,原因是初始化b指针的时候将b指向了字符串常量"azzzxxxddd"的首地址,再次赋值"azzzxxxdddccccc"时,又将b指向了字符串常量"azzzxxxddd"的首地址,无论字符串长度怎么增加都不会内存溢出,可见初始化b的时候并没有分配内存,只是做了指向动作。

    2.字符串指针变量分配动态内存和赋值

    2.1

    #include<stdio.h>
    #include<string.h>
    
    int main(){
            char *b=(char*) malloc(5*sizeof(char));
            strcpy(b, "abcdefghids");
            printf("%s", b);
           system("pause");
            return 0;
    }

    结果:没有报错,b赋值成功,正常输出。

    原因分析:这里为什么没有内存溢出呢,原因是虽然b指针指向了一段拥有5字符内存空间,但是恰好顺序下来的空间没有填满,所以后面的字符能装下。现在把这个字符串扩充至5000字节赋值再次运行,结果内存溢出报错。

     2.2

    int main(){
           
            char *a="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            char *b=(char*) malloc(5*sizeof(char));
             b = a;
             printf("%s", b);
            system("pause");
            return 0;
    }

    结果:没有报错,b赋值成功,正常输出。

    原因分析:这里为什么没有内存溢出呢,原因是虽然b指针指向了一段拥有5字符内存空间,但是第二次赋值指针b指向了a指针所指向的地址,原来给b分配的内存空间没有使用。现在把a指向的字符串扩充至5000字节再次运行,依然没有报错,再次证明了这一点,也说明了直接赋值和使用strcpy函数赋值的区别。

    2.3

    int main(){
           
            char a[20]="aaaaaaaaaaaaaaaaa";
            char *b=(char*) malloc(5*sizeof(char));
            b = &a;
            printf("%s", b);
           system("pause");
            return 0;
    }

    结果:没有报错,b赋值成功,正常输出。

    原因分析:道理同2.2,只是把字符串常量放入了数组,再另b指向数组a的首元素地址。

    2.4

    int main(){
            char a[20]="aaaaaaaaaaaaaaaaa";
            char *b=(char*) malloc(5*sizeof(char));
            strcpy(b,  a);
            printf("%s", b);
           system("pause");
            return 0;
    }

    结果:没有报错,b赋值成功,正常输出。

    原因分析:道理同2.1,把数组a改为5000容量,内放5000字符会内存溢出报错。

    总结 :指针变量初始化赋值或直接赋值不会分配内存空间,赋值也只是改变了指针的指向,经过malloc动态分配内存后指针会指向一段连续的未被使用的内存空间,如果此时再使用直接赋值,指针就会指向新赋值的字符串首地址而放弃指向原来的分配空间,如果是用strcpy函数,它会将第二个参数填至指针指向的新内存空间,这是需要注意的。

    转载于:https://my.oschina.net/u/554660/blog/287233

  • 相关阅读:
    2.8日自学成果
    深入数据库同步技术(3)-da-syncer介绍
    敢啃“硬骨头”,开源分布式数据库TiDB如何炼成?
    使用Sqlserver事务发布实现数据同步
    数据一致性-分区可用性-性能—多副本强同步数据库系统实现之我见
    sqlserver2014两台不同服务器上数据库同步
    采用存储复制方式同步数据,实现数据库安全升级
    Linux系统MySQL数据库主从同步实战过程
    红帽携手SAP,推动下一代移动数据库开发与同步
    阿里数据库十年变迁,那些你不知道的二三事
  • 原文地址:https://www.cnblogs.com/ligei/p/12486079.html
Copyright © 2011-2022 走看看