C语言指针+1实际增加的大小
by 宋强
原来一直以为指针本质就是地址,无论什么指针只要+1就会自增1,直到今天写gpio的驱动,需要动态生成结构体的时候,我是这么写的:
for(i = 0 ; i < 9; i++)
{
pdev.name = "s3c24xx-gpio";
pdev.id = i;
pdev.dev.platform_data = pdata;
pdev += sizeof(struct platform_device);
}
然后就各种出错,get_kobject失败,strcmp失败,总之把9变成1然后只初始化1个就没问题,后来发现写成这样就可以了:
for(i = 0 ; i < 9; i++)
{
pdev[i].name = "s3c24xx-gpio";
pdev[i].id = i;
pdev[i].dev.platform_data = pdata;
}
比较疑问的是当初大一就知道&data[i]和data + i代表的东西是一样的,那这里难道是(pdev+1)->name??试了下,还真是!
这个疑问的地方我写了一个测试的小程序:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct student{
int age;
int sex;
};
int main()
{
uint8_t i;
struct student *pStudents = (struct student *)malloc(5*sizeof(struct student));
if(!pStudents)
{
printf("malloc error. \n");
}
printf("size of struct student: %d\n", sizeof(struct student));
for(i = 0; i < 5 ;i++)
{
(pStudents + i)->age = i;
(pStudents + i)->sex = 2*i;
}
printf("p: %x, p+1: %x\n", pStudents, pStudents + 1);
for(i = 0 ; i < 5 ; i++)
{
printf("address age: %x, address sex: %x", &((pStudents + i)->age), &((pStudents + i)->sex));
printf("age: %d, sex: %d\n", (pStudents + i)->age, (pStudents + i)->sex);
}
free(pStudents);
}
输出结果:
duke@localhost testC]$ ./test
size of struct student: 8
p: 11d1010, p+1: 11d1018
address age: 11d1010, address sex: 11d1014age: 0, sex: 0
address age: 11d1018, address sex: 11d101cage: 1, sex: 2
address age: 11d1020, address sex: 11d1024age: 2, sex: 4
address age: 11d1028, address sex: 11d102cage: 3, sex: 6
address age: 11d1030, address sex: 11d1034age: 4, sex: 8
从p和p+1的值就可以看出来,原来p+1实际加了多少是和类型有关的,原来的认识一直不对。
tags: C - 指针