zoukankan      html  css  js  c++  java
  • 字符数组定义问题

    问题代码如下:

    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>

    void parse(char* buf,char* args[])
    {
      printf("buf=%s ",buf);
      int i=0;
      while(*buf!='')
      {
        args[i]=buf;
        while((*buf!=' ')&&(*buf!=' ')&&(*buf!=' ')) buf++;
        while( (*buf==' ') || (*buf==' ') || (*buf==' ') )
        {
          *buf = '';  //注意本行
          buf++;
        }
        i++;
      }
      args[i]='';
      int j=0;
      while(j<i)
      {
        printf("arg[%d]=%s ",j,args[j]);
        j++;
      }
      return;
    }

    int main()
    {
      char* args[4];
      char buf[100]="a b c";  //-1-这里字符数组的定义有讲究
      parse(buf,args);
      execvp(*args,args);
      return 0;
    }

    -1-处的字符数组定义时需要注意,按照上面代码的代码定义并初始化没有问题,此时buf地址分配在非常量区,即非只读区,所以可以调用parse(buf,args)中的*buf='';

    使用gdb查看此时堆栈结构:

    Breakpoint 1, parse (buf=0x7fffffffe661 " b c", args=0x7fffffffe640) at parse.C:15
    15 *buf = '';

    但是如果此时这样定义:

      char* buf="a b c";

    此时的buf分配在常量区,调用parse(buf,args)中的*buf=''时就会出现“Segmentation fault”,此时使用gdb查看出现错误的原因是:

    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000400629 in parse (buf=0x4007f3 " b c", args=0x7fffffffe640) at parse.C:15
    15 *buf = '';

    此时可以看到两次分配的buf的地址区域是不一样的,正确地址分配在非常量区(应该是在栈区),错误时分配在常量区;

  • 相关阅读:
    作业5,6 2019/10/23
    作业1、2、3、4 2019/10/23
    实现Map传参Mybatis
    maven工程配置pom.xml实现mybatis的访问数据库操作
    测试
    Postman篇之命令行测试
    unittest框架
    测试
    测试
    测试
  • 原文地址:https://www.cnblogs.com/coderxiaocai/p/4651481.html
Copyright © 2011-2022 走看看