首页 > 解决方案 > 在另一个函数中修改后指针数组不变

问题描述

字符指针数组在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但不在主函数内部,即使我们正在传递一个指向数组的指针。我在这里想念什么?

标签: arrayscpointersembeddeddynamic-arrays

解决方案


您也可以通过修改如下尝试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);

推荐阅读