arrays - 在另一个函数中修改后指针数组不变
问题描述
字符指针数组在main
. 情况如下:在内部main
,声明了一个 chars 指针数组并为其分配了内存。main
调用另一个函数,该函数AddItems
将项目添加到列表中,并且该函数调用doubleSize
将列表的大小加倍。AddItems
在内部添加新项目并将数组大小加倍方面,一切都按预期工作。然而,问题是当AddItems
返回时,main 仍然有一个旧的列表副本,即使我们传递了一个指向列表的指针。
这是一个MWE:
#define INITIAL_SIZE (4)
int main(void)
{
char **list = (char **) malloc(INITIAL_SIZE * sizeof(char *));
int list_size = INITIAL_SIZE;
for (int i = 0; i < list_size; i++) {
list[i] = (char *) malloc(5 * sizeof(char));
strcpy(list[i], "jane");
}
printf("main--> address of list: %p\n", list);
/* output = 0x7fc15e402b90 */
addItems(list, &list_size);
/* After adding items: */
printf("main--> address of list: %p\n", list);
/* output = 0x7fc15e402b90 (no change) */
return 0;
}
以下是另外两个示例函数:
void doubleSize(char ***list, int *current_size)
{
char **newList = (char**) malloc(*current_size * 2 * sizeof(char*));
for (int i = 0; i < *current_size; i++)
newList[i] = (*list)[i];
free(*list);
*list = newList;
*current_size = (*current_size) * 2;
}
void addItems(char **list, int * size)
{
printf("Before doubling: %p\n", list);
/* Output: 0x7fc15e402b90 */
/* Double the size */
doubleSize(&list, size);
printf("After doubling: %p\n", list);
/* Output: 0x7fc15e402be0 */
}
的地址list
正在更改为新创建的数组内部doubleSize
和内部addItems
但不在主函数内部,即使我们正在传递一个指向数组的指针。我在这里想念什么?
解决方案
您也可以通过修改如下尝试addItems
char** addItems(char **list, int * size)
{
printf("Before doubling: %p\n", list);
/* Output: 0x7fc15e402b90 */
/* Double the size */
doubleSize(&list, size);
printf("After doubling: %p\n", list);
/* Output: 0x7fc15e402be0 */
return list;
}
来自的电话main
应该是:
list = addItems(list, &list_size);
推荐阅读
- spring - 在哪个场景中,我们在 applicationContext 上调用 refresh(),start() 和 refresh() 方法有什么区别?
- java - 在androidx中如何正确使用片段?
- javascript - 获取选定文本的锚点名称
- html - 在我的视差页面右侧出现神秘的空白
- xml - 如何将非常复杂的 XML 扁平化为包含根级别所有节点的新 XML
- regex - 引用单元格中的文本并将剩余文本返回到其他单元格
- jquery - jquery触发器没有传递单选按钮值
- javascript - 如何让这个按钮在多个 div 中滚动?
- javascript - 防止 var 值(选定选项)在窗口滚动时更改
- json - 如何在颤动中比较两个 JSON 字符串?