对结构在内存中的位置感到困惑

时间:2017-09-19 05:10:11

标签: c pointers memory struct memory-address

我正在探索指针,特别是当前正在搞乱结构指针。目前,我有这个代码:

#include <stdlib.h>
#include <stdio.h>

struct point{
double x;
double y;
};

int main(){
    char *pc;
    int *pi;
    struct point *pp;

    //char pointer
    printf("%p\n\n", (void*)pc);
    pc++;
    printf("%p\n\n", (void*)pc);

    //int pointer
    printf("%p\n\n", (void*)pi);
    pi += 2;
    printf("%p\n\n", (void*)pi);

    //struct pointer
    printf("%p\n\n", (void*)pp);
    pp -= 3;
    printf("%p\n\n", (void*)pp);
}

此代码的输出为:

0x104978036

0x104978037

0x7fff5ec4bbc8

0x7fff5ec4bbd0

0x0

0xffffffffffffffd0

我理解前4个输出,使用charint指针算法,但是我很困惑为什么它会为0x0指针的内存地址返回struct?另外,如果我想在内存中说出double y的地址,我该如何打印?

2 个答案:

答案 0 :(得分:6)

您的代码会调用未定义的行为,因为您的所有指针都使用未初始化

在启用警告的情况下进行编译(例如,GCC为@foreach($items as $item) <img src="{{ asset('images/'.$item->image) }}"> <br> {{ $item->name}} <br> {{ $item->price }} @endforeach )并将获得:

-Wall

像这样初始化你的指针,例如:

prog.c: In function 'main':
prog.c:15:5: warning: 'pc' is used uninitialized in this function [-Wuninitialized]
     printf("%p\n\n", (void*)pc);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:20:5: warning: 'pi' is used uninitialized in this function [-Wuninitialized]
     printf("%p\n\n", (void*)pi);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:25:5: warning: 'pp' is used uninitialized in this function [-Wuninitialized]
     printf("%p\n\n", (void*)pp);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~

并且可以得到:

char c = 'a';
char *pc = &c;
int i = 5;
int *pi = &i;
struct point p;
struct point *pp = &p;

答案 1 :(得分:4)

当您声明指针时,您必须为其分配内存,或者如果您不能使用它,则将其设置为null。

pc = malloc(sizeof(*pc));
pi = malloc(sizeof(*pi));
pp = malloc(sizeof(*pp));

不要忘记验证malloc的返回值!!!! (没有故意这样做)

您应该使用-W -Wall -Wextra -g进行编译,然后使用valgrind运行二进制文件。

此外,您不需要转换为void *,因为它已经是指针

结果如下:

0xf88010

0xf88011

0xf88030

0xf88038

0xf88050

0xf88020