二维数组中的第一个元素被覆盖 - C.

时间:2013-03-14 21:32:21

标签: c arrays pointers memory multidimensional-array

我一直有同样的问题,不管研究多少,我都无法理解。我已经提出了一些理论,为什么它可能会发生。

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

我认为可能归结为:

  1. 再次标记输入时的内存问题
  2. 数组“衰变”和指针
  3. 的问题
  4. 我的编译器讨厌我。
  5. 这是我的代码:

    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;
    }
    

1 个答案:

答案 0 :(得分: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;
    }
}