指针的行为就像局部变量一样,并没有保持其功能可修改

时间:2019-10-22 02:37:46

标签: c

我有一个指针,它指向A, 我将此指针传递给一个函数,在该函数中,更改了指针并指向B的指针, 当函数结束时,指针值恢复原状并指向A,这就是为什么?

int device_num = 0;
int display_devices_size = 3;
DISPLAY_DEVICE* display_devices = (DISPLAY_DEVICE*)malloc(sizeof(DISPLAY_DEVICE) * display_devices_size);
get_display_devices(display_devices,&display_devices_size,&device_num);

void get_display_devices(DISPLAY_DEVICE* display_devices, int* display_devices_size, int* device_num)
{
    DISPLAY_DEVICE d;
    d.cb = sizeof(DISPLAY_DEVICE);
    while (EnumDisplayDevices(NULL, *device_num, &d, 0))
    {
        //After the first call to EnumDisplayDevices DispDev.DeviceString contains graphic card's name. 
        //After the second call DispDev.DeviceString contains monitor's name.
        if (*device_num >= *display_devices_size)
        {
            DISPLAY_DEVICE* temp = (DISPLAY_DEVICE*)realloc(display_devices, (*display_devices_size) * sizeof(DISPLAY_DEVICE) * 2);
            if (temp != NULL)
            {
                display_devices = temp;
                *display_devices_size = *display_devices_size * 2;
            }
        }
        display_devices\[(*device_num)\] = d;
        (*device_num)++;
    }

}

详细信息如下截图:
before function
in function
after function

2 个答案:

答案 0 :(得分:0)

如果要更新指针,则需要传递指针的地址,而不是指针的内容。您的代码在子例程中分配了一个新的指针,但这对原始指针没有影响。下面的代码经过修改-我尚未检查该代码是否可以编译,但是可以看到更改。

int device_num = 0;
int display_devices_size = 3;
DISPLAY_DEVICE* display_devices = (DISPLAY_DEVICE*)malloc(sizeof(DISPLAY_DEVICE) * display_devices_size);

// Pass the ADDRESS of display_devices

get_display_devices(&display_devices,&display_devices_size,&device_num);

// Function takes a pointer to a pointer as the first argument.

DISPLAY_DEVICE* get_display_devices(DISPLAY_DEVICE** display_devices, int* display_devices_size, int* device_num)
{
    DISPLAY_DEVICE d;
    d.cb = sizeof(DISPLAY_DEVICE);
    while (EnumDisplayDevices(NULL, *device_num, &d, 0))
    {
        //After the first call to EnumDisplayDevices DispDev.DeviceString contains graphic card's name.
        //After the second call DispDev.DeviceString contains monitor's name.
        if (*device_num >= *display_devices_size)
        {
            DISPLAY_DEVICE* temp = (DISPLAY_DEVICE*)realloc(*display_devices, (*display_devices_size) * sizeof(DISPLAY_DEVICE) * 2);
            if (temp != NULL)
            {
                *display_devices = temp;
                *display_devices_size = *display_devices_size * 2;
            }
        }
        (*display_devices)[*device_num] = d;
        (*device_num)++;
    }

}

答案 1 :(得分:0)

此函数不返回值,因此其类型应为void

声明指针变量(在本例中为DISPLAY_DEVICE *)时,为其分配的内存为sizeof(DISPLAY_DEVICE *),而不是sizeof(DISPLAY_DEVICE)。该内存就是调用方中名称“ display_devices”的名称。

realloc可以更改所指向的地址(如果无法调整参数存储块的大小,则会分配新的内存并取消分配旧的内存)。因此,此函数应使用一个指向调用程序中称为“ display_devices”的指针,以便可以更改该内存位置。

函数原型应为:

void get_display_devices(DISPLAY_DEVICE** display_devices, int* display_devices_size, int* device_num)

,它应该称为

get_display_devices(&display_devices,&display_devices_size,&device_num);

此外,应将已调用函数中对“ display_devices”的所有引用更改为* display_devices,以将该内存位置的值取消引用到新分配。所有对display_devices_size的引用都应保持不变。

n.b .:我什至都没有达到函数应该做的事情,我只是在回答您询问的有关指针操作的问题。看来您需要做更多的工作,才能执行您想要的操作。