【问题标题】:pointers deference in c [duplicate]c中的指针尊重[重复]
【发布时间】: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


【解决方案1】:

指针c1未初始化,值不确定。

int *c1;

所以取消引用指针

*c1=10;

导致未定义的行为。

此外,对于不指向与您正在执行的相同数组的元素的指针,您可能不会应用减法运算

c2-c1

注意运算符sizeof返回的值是size_t类型。这意味着您需要在printf 的调用中使用转换说明符zu 而不是d

printf("%zu\n", sizeof(c1));

要输出指针,您需要使用转换说明符 p 而不是 d

printf("%p\n", ( void * )c1);

并且根据 C 标准,没有参数的函数 main 应该像这样声明

int main( void )

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2011-06-25
    • 2012-06-10
    • 1970-01-01
    • 2013-08-07
    • 2019-10-23
    相关资源
    最近更新 更多