• 字符数组定义问题


    问题代码如下:

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

  • 相关阅读:
    wmi
    Python中基本同步原语的使用
    Python多线程的几种实现方式
    TCP/IP详解 卷1 第一章 概述
    对利用sqlmap获取os-shell过程的一次抓包分析
    12.19 Aggregate (GROUP BY) Functions
    13.2.9 SELECT 语法
    GitHack 源码分析
    CTF遇到的问题-长期更新
    在Windows server2008中搭建sqli-lab实验环境
  • 原文地址:https://www.cnblogs.com/coderxiaocai/p/4651481.html
Copyright © 2020-2023  润新知