【问题标题】:Segmentation Fault for directory modifications?目录修改的分段错误?
【发布时间】:2010-10-15 16:40:55
【问题描述】:

这是我的代码:

/*
 * main.c
 *
 *  Created on: 15 Oct 2010
 *      Author: mohit
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/dir.h>
#include <sys/unistd.h>

void print_usage();

int main(int argc, char *argv[])
{
    int i;
    char *directory;
    char *name;

    //Iterate through command line arguments
    for (i = 1; i < argc; i++)
    {
    if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
    {
        memcpy(directory, argv[i + 1], sizeof (argv[i + 1]));
        continue;
    }

    else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
    {
        memcpy(name, argv[i + 1], sizeof (argv[i + 1]));
        continue;
    }
}

if (!name)
{
    perror("\n\nIncorrect Usage! Name was not provided!\n\n");
    print_usage();
}
if (directory)
    chdir(directory);

printf("\nCreating %s.theme directory...\n", name);
mkdir(strcat(name, ".theme"), "a+rw");
printf("Created %s.theme...\n", name);

printf("Entering %s.theme...\n", name);
chdir(strcat(name, ".theme"));

printf("Creating Icons directory...\n");
mkdir("Icons", "a+rw");
printf("Created Icons...\n");

printf("Creating Bundles directory...\n");
mkdir("Bundles", "a+rw");
printf("Created Bundles...\n");

printf("Creating UIImages directory...\n");
mkdir("UIImages", "a+rw");
printf("Created UIImages...\n");

printf("Creating Folder directory...\n");
mkdir("Folder", "a+rw");
printf("Created Folder...\n");

return 0;
}

void print_usage()
{
printf("\n\nUsage: wbt-create [--directory directory] --name theme_name\n");
printf("\n\n\t wbt-create [-d directory] -n theme_name\n");
}

【问题讨论】:

    标签: c segmentation-fault


    【解决方案1】:

    argv 中的参数将在您的程序运行时保持分配状态。因此,您可以避免memcpy(和内存分配),而只需分配指针。示例如下:

    ...
    int main(int argc, char *argv[])
    {
        int i;
        char *directory;
        char *name;
    
        //Iterate through command line arguments
        for (i = 1; i < argc; i++)
        {
        if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
        {
            directory = argv[i + 1];
            continue;
        }
    
        else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
        {
            name = argv[i + 1];
            continue;
        }
    }
    ...
    

    但是,我强烈推荐使用getopt。这是一个相当标准的库,可以很好地处理这些事情。

    【讨论】:

      【解决方案2】:
      char *directory;
      char *name;
      

      那些是声明指针,但不为它们分配任何内存。当您执行 memcpy() 将数据复制到这些指针时,您将得到 Seg 错误。

      您可以改为在堆栈上声明 char 数组,例如:

      char directory[100];
      

      否则您将不得不使用 malloc() 自己分配内存。

      【讨论】:

      • 为什么要分配不必要的内存? argv 不会去任何地方。
      • @Michael 对于这个确切的情况,肯定会奏效。但总的来说,人们应该明白为什么会发生这种段错误,这就是我想指出的。
      【解决方案3】:

      变化:

      int main(int argc, char *argv[])
      {
          int i;
          char *directory;
          char *name;
      
          //Iterate through command line arguments
          for (i = 1; i < argc; i++)
          {
              if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
              {
                  memcpy(directory, argv[i + 1], sizeof (argv[i + 1]));
                  continue;
              }
      
              else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
              {
                  memcpy(name, argv[i + 1], sizeof (argv[i + 1]));
                  continue;
              }
          }
          ...
      

      到:

      #include <limits.h>
      
      int main(int argc, char *argv[])
      {
          int i;
          char directory[PATH_MAX];
          char name[PATH_MAX];
      
          //Iterate through command line arguments
          for (i = 1; i < argc; i++)
          {
              if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
              {
                  strcpy(directory, argv[i + 1]);
                  continue;
              }
      
              else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
              {
                  strcpy(name, argv[i + 1]);
                  continue;
              }
          }
          ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 2016-03-13
        相关资源
        最近更新 更多