int main(){
  int i, department_quantity;
  char *passer[8];
  char *department_id = malloc(8);

  printf("Enter number of departments:");
  scanf("%d", &department_quantity);

  for(i = 0; i < department_quantity; i++){
      printf("Enter ID of department #%d\n", i + 1);
      scanf("%s", department_id);
      passer[i] = department_id;
  }

  string_array(&passer[0], department_quantity);

}

void string_array(char *array[], size_t length) {
    int i ;
    for (i = 0; i < length; i++) {
        printf("\n%s\n", array[i]);
    }
}


示例输出:

   Enter number of departments:2

   Enter id of department #1

   hello

   Enter id of department #2

   world

   world

   world


我试图了解为什么我无法让程序输出不同的用户输入,即“ hello world”而不是“ world world”。我对这里的指针不了解什么?

最佳答案

department_id只是同一块内存。对于每个输入(每次迭代),您都在相同的内存地址进行写入,从而有效地覆盖了先前的内容。因此,最后,您所拥有的就是您输入的最后一个单词。请注意,passer将包含等效元素(指针相同)。

要解决此问题,您需要为每个字符串分别分配内存。像这样:

for(i = 0; i < department_quantity; i++) {
    // ...
    department_id = malloc(8); // here
    scanf("%s", department_id);
    passer[i] = department_id; // now passer[i] is a different pointer each time
}


或者,您可以放弃department_id并选择不分配动态内存的char passer[8][8],然后只需scanf("%s", passer[i]);

附言以这种方式使用scanf是非常危险的,因为没有什么可以阻止您输入太大而无法容纳已分配内存的字符串。通常的方法是fgets(passer[i], 8, stdin),其中passerchar passer[8][8]-注意8是缓冲区的大小。

09-06 11:20