2013-03-14 86 views
0

我一直有同样的问题一段时间了,无论多少研究,我似乎都无法控制它。我想出了一些为什么它可能会发生的理论。被覆盖的二维数组中的第一个元素 - C

基本上,我正在编写一个简单的C shell,并且在尝试实现我要存储在二维数组中的别名时遇到了一个恼人的错误。无论何时我尝试将多个别名分配给数组,它都会覆盖第一个元素。

我想这可能是下来:再次令牌化输入

  • 问题与阵列“衰退”和指针
  • 我的编译器恨我当

    1. 内存问题。

    这里是我的代码:

    void fillArray(char* tokens[], char* aliasArray[ALIAS_NO][TOKEN_NUM]) { 
        /* Integer for the for loop */ 
        int i; 
        /* Counter for attribute addition */ 
        int counter = 2; 
        /* Onto the search */ 
        for (i = 0; i < ALIAS_NO; i++) { 
         if (aliasArray[i][0] == NULL) { /* If there is a space here */ 
          aliasArray[i][0] = tokens[counter-1]; /* Assign the alias */ 
          while (tokens[counter] != NULL) { /* While there is still stuff left */ 
           aliasArray[i][counter-1] = tokens[counter]; /* Add it in */ 
           counter++; /* Increment the counter */ 
          } 
          return; 
         } 
        } 
        return; 
    } 
    

    凡ALIAS_NO和TOKEN_NUM分别为10和50的值的预处理指令。

    该检查用于查看当我打印i的状态时该条目是否为空,并且我还将多维数组中的每个元素初始化为NULL。

    任何援助将不胜感激。现在我已经把我的头靠在墙上撞得太久了。

    谢谢:)

    编辑:我也试着使用的strcpy()函数。不幸的是,这引发了分段错误。

    编辑:新的代码

    void fillArray(char* tokens[], char* aliasArray[ALIAS_NO][TOKEN_NUM]) { 
    /* Integer for the for loop */ 
    int i; 
    /* Counter for attribute addition */ 
    int counter = 2; 
    /* Buffer */ 
    char buffer[200]; 
    /* Onto the search */ 
    for(i = 0; i < ALIAS_NO; i++) { 
        if(aliasArray[i][0] == NULL) { /* If there is a space here */ 
         strcpy(buffer, tokens[counter-1]); 
         aliasArray[i][0] = buffer; /* Assign the alias */ 
         while (tokens[counter] != NULL) { /* While there is still stuff left */ 
          strcpy(buffer, tokens[counter]); 
          aliasArray[i][counter-1] = buffer; /* Add it in */ 
          counter++; /* Increment the counter */ 
         } 
         return; 
        } 
    } 
    return; 
    } 
    
  • +0

    你分配一个新的字符串复制到做你'strcpy'之前? – 2013-03-14 21:48:22

    +0

    这不会影响我的返回值和/或分配吗?或者你的意思是我可以将'tokens [counter]的值复制到一个缓冲区中,然后将'aliasArray [i] [counter]'分配给那个? – 2013-03-14 21:50:20

    +1

    这就是我的意思。您可能每次都使用相同的缓冲区作为令牌,并使用不同的值填充它们。由于您正在将一个指针存储在'aliasArray'中的那些缓冲区中,'aliasArray'将始终反映放入这些缓冲区的最新值。 – 2013-03-14 21:53:47

    回答

    2
    for(i = 0; i < ALIAS_NO; i++) 
    { 
        if(aliasArray[i][0] == NULL) 
        { 
         aliasArray[i][0] = strdup(tokens[counter-1]); 
         while (tokens[counter] != NULL) 
         { 
          aliasArray[i][counter-1] = strdup(tokens[counter]); 
          counter++; 
         } 
         break; 
        } 
    } 
    
    +1

    这是你想要的基础。你现在负责这些字符串的生命周期,所以你需要确保在你完成它们时释放它们。 – 2013-03-14 22:33:08

    +0

    完美地工作,非常感谢你们的帮助:) – 2013-03-14 22:38:38

    相关问题