为什么不能修改指针值?[duplicate]

uoifb46i  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(141)

此问题在此处已有答案

malloc in a function doesn't work well(3个答案)
4天前关闭。
我很熟悉这段代码来修改一个数组,在一个函数中调用它arr

void foo(int *arr) {
    arr[0] = 3;
}

int main() {
    int arr[] = { 1, 2, 3, 4 };
    foo(arr);
    printf("new value: %d\n", arr[0]); // prints 3
}

但是现在假设我在main中有一个指针,我想把它当作一个数组。

int main() {
    int *p;
}

在我的函数foo中,现在我分配了no整数来存储在p中,并更改它们的值或任何东西来更改初始数组。

void foo(int *arr, int no) {
    arr = (int *)malloc(no * sizeof(*arr));
    // some code to change the array
    arr[0] = 1;
}

现在如果我用一个随机值调用foo函数,然后尝试打印数组的第一个元素,我会得到一个空白屏幕,我不明白为什么。
在函数中,我将指针的引用改为动态分配的数组,所以没有问题。
最简单的修复方法是返回数组,而不是将其作为指针传递。

int *foo(int no) {
    arr = (int *)malloc(no * sizeof(*arr));
    // some code to change the array
    arr[0] = 1;

    return arr;
}

同样在main函数中,我将简单地使用int* p = foo(10);,这是最简单的修复方法。
我想知道为什么传递指针不会打印任何东西。

hyrbngr7

hyrbngr71#

arrarr = ...)的赋值与对任何参数的赋值有相同的问题。例如,你不会期望对no的赋值(例如no = 5;)在函数中起作用?
为了能够修改函数中的任何数据,函数需要一个指向数据的指针。如果你想修改一个指针,那么你需要一个指向该指针的指针:

void foo(int **parr)
{
    *parr = malloc(...);
}

你需要使用指针操作符来传递它:

int *arr;
foo(&arr);
pbossiut

pbossiut2#

函数foo定义为:

void foo(int *arr, int no) {
    arr = (int *)malloc(no * sizeof(*arr));
    // some code to change the array
    arr[0] = 1;
}

分配一个数组并初始化它的第一个元素,但是作为foo(p)传递给foo的调用方变量p没有被修改,只有局部参数arg得到更新,并且当函数返回时其最终值丢失,导致分配的内存不可访问(* 内存泄漏 *)。
将指针p的未初始化值传递给foo是没有意义的(实际上它有未定义的行为),您必须返回foo中分配的指针,并将此返回值存储到main中的局部变量:

#include <stdio.h>
#include <stdlib.h>

void foo(int no) {
    int *arr = (int *)malloc(no * sizeof(*arr));
    // some code to change the array
    if (arr != NULL) {
        arr[0] = 1;
    }
    return arr;
}

int main(void) {
    int *arr = foo(2);
    if (arr != NULL)
        printf("new value: %d\n", arr[0]); // prints 1
    free(arr);
    return 0;
}

相关问题