从C中删除指针和指向指针的元素

时间:2018-11-12 17:17:46

标签: c pointers pointer-to-pointer

仍在学习中,这是我正在处理的一段代码,我正在尝试从指针/指针-指针中删除一个或多个元素。问题接近代码的结尾。

int total, tempX = 0;

printf("Input total people:\n");fflush(stdout);
scanf("%d",&total);
printf("You entered:  %i\n", total);

char **nAmer = (char**) malloc(total * sizeof(char*)); //pointer pointer for username
for (tempX=0; tempX<total; tempX++){
   nAmer[tempX] = malloc(21);
}

double *nUmer = (double*) malloc(total* sizeof(double)); //pointer for usernumber

printf("input their name and number:\n");fflush(stdout);

for (tempX = 0; tempX<total; tempX++){
    scanf("%20s %lf", nAmer[tempX], &nUmer[tempX]);
}

printf("Let me read that back:\n");
for (tempX = 0; tempX<total; tempX++){
   printf("Name: %s Number: %lf\n", nAmer[tempX], nUmer[tempX]);
}

char *searcher = (char*) malloc(21 * sizeof(char*)); //temporary string made by the user to compare names
printf("Enter name to remove user(s):\n");fflush(stdout);
scanf("%20s",searcher);
for (tempX = 0; tempX < total; tempX++){
    if (strcmp(searcher,nAmer[tempX])==0){ //what is better to replace this section?
       free(nAmer[tempX]); //I can assume this wont work well
       free(nUmer[tempX]); //I know this is a problem
   }
}
printf("Let me read that back with removed user(s):\n");fflush(stdout);
for (tempX = 0; tempX<total; tempX++){
    printf("Name: %s Number: %lf\n", nAmer[tempX], nUmer[tempX]);
}

我知道free (nAmer[tempX]);可以工作,但不允许删除后回读。什么会解决这个问题?

2 个答案:

答案 0 :(得分:0)

您不应该free(nUmer[tempX]);,因为这不是指针。

当释放名称指针之一时,可以将其设置为NULL。然后循环将显示可以跳过它的数组。

for (tempX = 0; tempX < total; tempX++){
    if (strcmp(searcher,nAmer[tempX])==0){ //what is better to replace this section?
       free(nAmer[tempX]);
       nAmer[tempX] = NULL;
   }
}
printf("Let me read that back with removed user(s):\n");fflush(stdout);
for (tempX = 0; tempX<total; tempX++){
    if (nAmer[tempX]) {
        printf("Name: %s Number: %lf\n", nAmer[tempX], nUmer[tempX]);
    }
}

您还有另一个错误:

char *searcher = (char*) malloc(21 * sizeof(char*)); //temporary string made by the user to compare names

这应该只是* sizeof(char)(或者您可以将其省略,因为sizeof(char)被定义为1)。

幸运的是,这会分配比所需更多的内存,而不是更少。

答案 1 :(得分:0)

您有两个选择。

  1. 释放指针后,将nAmer中的指针更改为NULL,请勿更改nUmer。这样,在处理nAmer[i]nUmer[i]中的条目时,您可以检查nAmer[i]是否有效(!=NULL)(==NULL)并忽略该条目,如果这是无效的。
  2. 您可以将删除的条目之后的所有条目在数组中上移一个,并记住现在没有total个条目,而只有total-1个条目。

请不要free(nUmer[i])nUmer中的条目是双精度的,而不是指针。您不能free