我有一个指针,它指向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
答案 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 .:我什至都没有达到函数应该做的事情,我只是在回答您询问的有关指针操作的问题。看来您需要做更多的工作,才能执行您想要的操作。