知识杂货铺

不卖切糕

View on GitHub
11 December 2017 05:40

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 - 指针