【发布时间】:2021-10-21 00:01:45
【问题描述】:
当我尝试在下面两个代码中运行它时。对于第一个,我遇到了分段错误错误。不知道为什么?
void main() {
int *c1;
*c1=10;
printf("%d\n", *c1);
printf("%d\n", sizeof(c1));
printf("%d\n", sizeof(*c1));
printf("%d\n", c1);
}
当我运行下面的代码时,它会成功打印输出。
void main() {
int *c1;
*c1=10;
printf("%d\n", *c1);
printf("%d\n", sizeof(c1));
printf("%d\n", sizeof(*c1));
printf("%d\n", c1);
int *c2=c1+1;
printf("%d\n", c2);
printf("%d\n",c2-c1);
}
谁能解释其中的区别?据了解,我将值 10 分配给持有地址的指针 c1,试图在 c1 处打印值。所以在两者中它都应该抛出 segv 错误。有人请澄清一下
【问题讨论】:
-
c1是未初始化的,所以你不能取消引用它。行为未定义。另外:使用%zu作为sizeof,使用%p作为指针值。注意所有编译器警告。 -
两个程序都使用未初始化的指针
c1,它会触发未定义的行为。您尝试将 1' 分配给c1中包含的内存地址,但您从未将任何有效的内存地址放入c1,而是c1包含未确定的值 -
@gregni Tutorialspoint 是一个通常不好的来源,我不会推荐它。例如,在您链接的页面中,
%x被用于打印指针地址,而应使用%p。 -
我建议先学习 C,然后再做一些随机的事情。
标签: c linux pointers memory heap-memory