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

  • 相关阅读:
    扩展的局域网
    参数估计
    以太网的 MAC 层
    poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数
    tarjan算法--求解无向图的割点和桥
    spfa负环判断
    codeforce 489d bfs分层处理
    并查集优化——压缩路径——秩优化
    SPFA_queue_链式前向星最短路 & HDU2433
    POJ3046选蚂蚁创建集合_线性DP
  • 原文地址:https://www.cnblogs.com/coderxiaocai/p/4651481.html
Copyright © 2011-2022 走看看