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)
,其中passer
是char passer[8][8]
-注意8
是缓冲区的大小。