我正在探索指针,特别是当前正在搞乱结构指针。目前,我有这个代码:
#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个输出,使用char
和int
指针算法,但是我很困惑为什么它会为0x0
指针的内存地址返回struct
?另外,如果我想在内存中说出double y
的地址,我该如何打印?
答案 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