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

  • 相关阅读:
    win7网络共享原来如此简单,WiFi共享精灵开启半天都弱爆了!
    JQUERY UI Datepicker Demo
    Official online document, install svn server in centOS
    JAVE not work in linux
    AMR 转mp3 失败
    XD, XR, DR 股票
    Linux 下MySql 重置密码
    Difinition Of Done
    Apache, Tomcat, JK Configuration Example
    Linux 安装tomcat
  • 原文地址:https://www.cnblogs.com/ligei/p/12486079.html
Copyright © 2011-2022 走看看