当前位置: 技术问答>linux和unix
指针的疑问,大家帮我解释一下吧
来源: 互联网 发布时间:2016-02-16
本文导语: 1:定义一个结构,可以先不管结构是什么内容 struct atmel_uart_port { struct uart_port uart; /* uart */ struct clk *clk; /* uart clock */ unsigned short suspended; /* is port suspended? */ sh...
1:定义一个结构,可以先不管结构是什么内容
struct atmel_uart_port {
struct uart_port uart; /* uart */
struct clk *clk; /* uart clock */
unsigned short suspended; /* is port suspended? */
short use_dma_rx; /* enable PDC receiver */
short pdc_rx_idx; /* current PDC RX buffer */
struct atmel_dma_buffer pdc_rx[2]; /* PDC receier */
short use_dma_tx; /* enable PDC transmitter */
struct atmel_dma_buffer pdc_tx; /* PDC transmitter */
};
struc atmel_uart_port amtel_ports[ATMEL_MAX_UART]; // 注意,这里声音的是全局变量
2:一个函数功能
static int __devinit atmel_serial_probe(struct platform_device *pdev)
{
struct atmel_uart_port *port; // 注意,这里声明的是一个结构指针
int ret;
port = &atmel_ports[pdev- >id]; // 问题1:port和atmel_ports[pdev- >id]指向同一个地址还是二个不同的地方?这语句是取地址给port,还是拷贝数据给port?
atmel_init_port(port, pdev);
ret = uart_add_one_port(&atmel_uart, &port- >uart);
if (!ret)
{
device_init_wakeup(&pdev- >dev, 1);
platform_set_drvdata(pdev, port);
}
return ret;
}
static int __devexit atmel_serial_remove(struct platform_device *pdev)
{
struct uart_port *port = platform_get_drvdata(pdev); // 问题2: 同问题1
struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; // 问题3:同问题1
int ret = 0;
device_init_wakeup(&pdev- >dev, 0);
platform_set_drvdata(pdev, NULL);
if (port) {
ret = uart_remove_one_port(&atmel_uart, port);
kfree(port); // 最终问题:假设只是指向同一个地址,port和全局变量amtel_ports是同一个地址,那么这里有必须释放吗?如果不是同一个地址,那么问题又来了,我们声明 char a[100]; char *b = &a[60];这里可是指向同一个地址啊?难道结构与数组指针不一样吗?
}
return ret;
}
struct atmel_uart_port {
struct uart_port uart; /* uart */
struct clk *clk; /* uart clock */
unsigned short suspended; /* is port suspended? */
short use_dma_rx; /* enable PDC receiver */
short pdc_rx_idx; /* current PDC RX buffer */
struct atmel_dma_buffer pdc_rx[2]; /* PDC receier */
short use_dma_tx; /* enable PDC transmitter */
struct atmel_dma_buffer pdc_tx; /* PDC transmitter */
};
struc atmel_uart_port amtel_ports[ATMEL_MAX_UART]; // 注意,这里声音的是全局变量
2:一个函数功能
static int __devinit atmel_serial_probe(struct platform_device *pdev)
{
struct atmel_uart_port *port; // 注意,这里声明的是一个结构指针
int ret;
port = &atmel_ports[pdev- >id]; // 问题1:port和atmel_ports[pdev- >id]指向同一个地址还是二个不同的地方?这语句是取地址给port,还是拷贝数据给port?
atmel_init_port(port, pdev);
ret = uart_add_one_port(&atmel_uart, &port- >uart);
if (!ret)
{
device_init_wakeup(&pdev- >dev, 1);
platform_set_drvdata(pdev, port);
}
return ret;
}
static int __devexit atmel_serial_remove(struct platform_device *pdev)
{
struct uart_port *port = platform_get_drvdata(pdev); // 问题2: 同问题1
struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; // 问题3:同问题1
int ret = 0;
device_init_wakeup(&pdev- >dev, 0);
platform_set_drvdata(pdev, NULL);
if (port) {
ret = uart_remove_one_port(&atmel_uart, port);
kfree(port); // 最终问题:假设只是指向同一个地址,port和全局变量amtel_ports是同一个地址,那么这里有必须释放吗?如果不是同一个地址,那么问题又来了,我们声明 char a[100]; char *b = &a[60];这里可是指向同一个地址啊?难道结构与数组指针不一样吗?
}
return ret;
}
|
问题1:指的是同一个地址。
释放不释放是看自己的设计。按照你这个函数的意思是退出的意思,应该需要释放。
释放不释放是看自己的设计。按照你这个函数的意思是退出的意思,应该需要释放。
|
struct uart_port *port = platform_get_drvdata(pdev); // 问题2: 同问题1
///////////////////////////////////////////////////////////////////////////
platform_get_drvdata(pdev); 这个函数从哪儿来的。它与全局数组有关系吗?如果它里面调用了malloc呢?
Linux驱动不懂,我只是随变问问
///////////////////////////////////////////////////////////////////////////
platform_get_drvdata(pdev); 这个函数从哪儿来的。它与全局数组有关系吗?如果它里面调用了malloc呢?
Linux驱动不懂,我只是随变问问
|
动态的才需要释放,指针赋值是指向同一个地方,kfree做了什么我不清楚
|
问题1:两者是指向同一地址,是取地址而非拷数据,,,当然指向同一地址,访问他们得到的数据是同一个了
释放的是动态从堆分配而来的内存空间,,比如通过malloc,,new等等 所以你这里没有必要释放
释放的是动态从堆分配而来的内存空间,,比如通过malloc,,new等等 所以你这里没有必要释放