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的地址区域是不一样的,正确地址分配在非常量区(应该是在栈区),错误时分配在常量区;

  • 相关阅读:
    openfire学习4------->android客户端聊天开发之聊天功能开发
    MTD中的nand驱动初步分析---面向u-boot
    在线代码编缉器
    三个角度解构云计算,商业驱动or技术驱动?
    分布式存储的三个基本问题
    云计算核心技术
    云计算历史
    《信息产业指南》云计算解读
    2017云计算市场需要密切关注的10个趋势
    2017云计算机会
  • 原文地址:https://www.cnblogs.com/coderxiaocai/p/4651481.html
Copyright © 2011-2022 走看看