[英]Passing Pointers to Pointers into Functions in C
我正在研究 class 項目,我仍在學習 C。
目標是詢問用戶今天有多少商品可供出售,然后要求他們將這些商品一個接一個地輸入到新行中,並將它們輸入到字符串數組中。
然后將數組打印為列表以顯示可用項目。
我們不能使用靜態聲明的 arrays,只能使用指針。
這里的函數是必需的。 我需要讓 get_items() function 修改數組而不是返回結果。
我在讓 get_items() 工作時遇到了很多麻煩。 當我 go 打印數組的項目時,我嘗試的任何操作都以“退出,分段錯誤”或打印(NULL)告終。
任何使這項工作的建議將不勝感激。
char* get_item() {
char *item = calloc(61,sizeof(char));
scanf(" %[^\n]",item);
return item;
}
void get_items(char ***items, int *num_items){
int i;
printf("Enter the %d available items one to a line: \n",*num_items);
for(i = 0; i < *num_items; i++) {
**(items+i) = get_item();
}
}
int main(void) {
char **items=NULL; /* this is the pointer for the start of the ingredients array */
int num_items = -1,
int i;
printf("How many available items do we have today? ");
scanf("%d",&num_items);
items = calloc(num_items,sizeof(char*));
get_items(&items,&num_items);
printf("Available items today are: \n");
for(i = 0; i < num_items; i++) {
printf("%i. %s\n",i+1,*(items+i));
}
在get_items
中, **(items+i)
應該是*(*items+i)
或(*items)[i]
。
但是, get_items
具有太多級別的指針取消引用。 以下更簡單:
void get_items(char **items, int num_items){
int i;
printf("Enter the %d available items one to a line: \n",num_items);
for(i = 0; i < num_items; i++) {
*(items+i) = get_item(); // or more readable: items[i] = get_item();
}
}
然后,從main
調用get_items
需要更改為以下內容:
get_items(items,num_items);
原始原型void get_items(char ***items, int *num_items)
表明main
中的一些代碼應該在get_items
中完成:
void get_items(char ***items, int *num_items){
int i;
printf("How many available items do we have today? ");
scanf("%d",num_items);
*items = calloc(*num_items,sizeof(char*));
printf("Enter the %d available items one to a line: \n",*num_items);
for(i = 0; i < *num_items; i++) {
*(*items+i) = get_item();
}
}
那么main
可以簡化為以下內容:
int main(void) {
char **items=NULL; /* this is the pointer for the start of the ingredients array */
int num_items = -1,
int i;
get_items(&items,&num_items);
printf("Available items today are: \n");
for(i = 0; i < num_items; i++) {
printf("%i. %s\n",i+1,*(items+i));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.