• c语言字符指针、字符串初始化问题


    之前,我在做图的存储结构的时候,用邻接矩阵来表示一张图,遇到一个段错误问题:

    上面只要一输入一条边,就会出现段错误,而段错误,往往就是内存地址访问出错,比如数组越界,访问了未分配的地址,访问系统已经分配的地址,都会出错,于是我将错误定位到输入边的这个位置

    上面就是我在循环之前,定义了两个字符指针,准备用来存放字符串,但是只要一scanf之后,只要访问其中某一个变量就会出现段错误,难道是说这个地址不能别访问?

    于是我做了一个实验,如下操作:

    直接上代码:

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5. void test(char* str)
    6. {
    7. printf("str=%s\n", str);
    8. if (strcmp("love", str) == 0) {
    9. printf("哈哈,字符串相等\n");
    10. }
    11. else
    12. {
    13. printf("字符串不相等\n");
    14. }
    15. }
    16. int main()
    17. {
    18. char* v1;
    19. scanf("%s", &v1);
    20. test(v1);
    21. system("pause");
    22. return 0;
    23. }

       然后就会内存地址访问错误

       那我又改成如下代码:

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5. void test(char* str)
    6. {
    7. printf("str=%s\n", str);
    8. if (strcmp("love", str) == 0) {
    9. printf("哈哈,字符串相等\n");
    10. }
    11. else
    12. {
    13. printf("字符串不相等\n");
    14. }
    15. }
    16. int main()
    17. {
    18. test("love");
    19. system("pause");
    20. return 0;
    21. }

    运行正常:

            

            

    换句话说,问题就出在:

             

     也就是说,不能用sacnf来初始化char*,下面我们就来分析一下:

      

    那么就是说,char* p存放的是常量字符串的地址,那我们就不能用scanf来初始化 ,因为如果用scanf来初始化,我们根本在常量区没有空间指向。而且就算有空间指向了常量区,也不能用scanf去初始化,比如如下:

            

    因为常量区的数据读写本来就是一旦定义了就不允许改动的 

    那么如果我们非要用scanf来初始化一个字符串呢,那么这里我们第一时间考虑的应该是一个字符数组,代码如下:

            

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5. void test(char* str)
    6. {
    7. printf("str=%s\n", str);
    8. if (strcmp("love", str) == 0) {
    9. printf("哈哈,字符串相等\n");
    10. }
    11. else
    12. {
    13. printf("字符串不相等\n");
    14. }
    15. }
    16. int main()
    17. {
    18. char str[10] = "pxx";//OK,并且带有'\0'
    19. scanf("%s", str);
    20. test(str);//char*指向了一个数组空间
    21. system("pause");
    22. return 0;
    23. }

     运行结果:

            

    对于test来说,相当于用char* str指向了char str[10]的这片数组空间,这个时候char*  str有指向了,并且可以改动,我们既可以用scanf来直接赋值。

            代码改动如下:

                     

            运行结果:

             

  • 相关阅读:
    Spring Cloud Alibaba Seata AT模式工作流程
    Java进阶篇--Condition与等待通知机制
    Java项目:ssm开发的Java快递代拿系统
    JKPacket权威指南——联系我们
    实战演练 | 使用纯 SQL 将表复制到新表
    Java核心知识:包装类
    阿里 P8 手写 Spring Cloud Alibaba 实战学习手册,架构师养成必备
    AIOps探索 | 应急处置中排障的降本增效方法探索(上)
    2020,XLNet: Generalized Autoregressive Pretraining for Language Understanding
    操作系统 | 进程与线程
  • 原文地址:https://blog.csdn.net/Pxx520Tangtian/article/details/125458142