我在尝试将指针用作另一个函数内的函数的参数时遇到了一些麻烦。我的目标是在每个函数中保留变量'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;
}
我的主要问题是:当我运行代码时,即使在commandInsert()函数中运行'counter ++'命令后,它也会继续发送计数器的'-1'值。为什么会发生这种情况?如何解决?
我想问题可能是在commandInsert(id,tableHash,counter,flag)调用,因为我没有使用引用符号(&),但是'counter'在内部使用identifyCommand()时已经是指针因为它的参数,所以我在这里缺少什么?
答案 0 :(得分:6)
由于您要更改counter
指向的值,您应该更改该值。但是你正在递增指针。
counter++;
应该是
(*counter)++;
正如@szczurcio所指出的那样,你传递的command
数组最多只能容纳5个字符(NUL终结符为1)。因此,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
,因为它将返回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;
...