指针的行为类似于局部变量,并且没有在函数中保持其修饰性



我有一个指针,它指向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)++;
}
}

详细信息如下屏幕截图:
函数之前在函数

之后

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

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)++;
}
}

此函数不返回值,因此它应为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的所有引用都应保持不变。

注意:我甚至没有接近函数应该做什么,我只是回答你提出的关于指针操作的问题。 在让它做你想要做的事情之前,你似乎需要更多的工作。

最新更新