C中函数内部函数的参数和指针

Parameters and pointers with function inside function in C

我在尝试使用指针作为另一个函数内的函数的参数时遇到了一些麻烦。我的目标是在每个函数中保留变量 'counter' 的值,换句话说,当最低函数声明一个 'counter++' 时,它的值必须为每个其他 'counter' 变量递增程序。

我的代码如下所示:

int main(int argc, const char * argv[]) {

    Hash tableHash;
    char command[6];
    int id = 0, counter = -1;
    int flags[4] = {0, 0, 0, 0};

    while(1) {
         identifyCommand(command, id, &tableHash, flags, &counter);
    }

    return 0;
    }

在我的 .h 中:

void identifyCommand(char* command, int id, Hash* tableHash, int* flag, int* counter){

    scanf("%s", command);

    /* ... */

    if(strcmp(command, "INSERT") == 0){
        scanf("%i", &id);
        commandInsert(id, tableHash, counter, flag);
    }

    /* ... */

    return;
}

void commandInsert(int id, Hash* tableHash, int* counter, int* flag){

    Registry x;
    x.key = id;

    if(flag[MALLOCFLAG]){
        tableHash->trees[*counter] = create_tree(x);
        counter++;
        flag[MALLOCFLAG] = 0;
    }
    else {
        insert_element(tableHash->trees[*counter], x);
    }
    return;
}

我的主要问题是:当我 运行 代码时,即使在 'counter++' 命令是 运行 inside commandInsert() 函数后,它仍会继续发送计数器的“-1”值.为什么会发生这种情况,我该如何解决?

我想问题可能出在 commandInsert(id, tableHash, counter, flag) 调用上,因为我没有使用引用符号 (&),但是 'counter' 在内部时已经是一个指针identifyCommand() 因为它的参数,所以我在这里缺少什么?

既然你想改变counter指向的,你应该改变这个值。但是你正在递增指针。

counter++;

应该是

(*counter)++;

正如@szczurcio 指出的那样,您传递的 command 数组最多只能容纳 5 个字符(1 个用于 NUL 终止符)。所以command数组的大小需要至少为7才能读取"INSERT"。为了防止缓冲区溢出,可以使用scanf()中的宽度如:

char command[7];
scanf("%6s", command); 

或者您可以使用 fgets().

char command[7];
fgets(command, sizeof command, stdin);

char *p = strchr(command, '\n');
if (p) *p = 0;

但是,由于您将 command 传递给函数,因此您不能在函数内部使用 sizeof command,因为那样会 return sizoof(char*)(数组衰减传递给函数时指向其第一个元素的指针)。所以你必须通过另一个参数传递尺寸信息:

来自来电者:

   while(1) {
     identifyCommand(command, sizeof command, id, &tableHash, flags, &counter);
   }

并且在函数中:

void identifyCommand(char* command, size_t size, int id, Hash* tableHash,
 int* flag, int* counter){

   fgets(command, size, stdin);

   /* To remove the trailing newline, if any */
   char *p = strchr(command, '\n');
   if (p) *p = 0;

   ...