【问题标题】:C - Assign value to pointer at position, is it possible?C - 将值分配给位置的指针,这可能吗?
【发布时间】:2021-03-22 10:14:08
【问题描述】:

在 Visual Studio 2019 中,我尝试在指定位置为 int 指针赋值,但它不起作用。这可能吗?

此外,我如何打印指针的值,而不是地址?

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

int main()
{
    int *p =(int*)calloc(10,1);
    
    p[0]=1;
    p[1]=0;
    p[2]=1;
    
    printf("%d\n",p);
}

谢谢

【问题讨论】:

  • 除非sizeof(int) 在您的系统上为 2(不太可能),否则该程序具有未定义的行为。您只为尝试存储 3 个整数的数组分配了 10 个字节。关于打印,使用%d 显示指针类型是不正确的,因为指针可能大于 int。正确的说明符是%p。相反,如果您尝试打印其中一个整数,则必须取消引用指针以选择一个:printf("%d\n", p[i]); 其中i 为 0、1 或 2。但请阅读我关于内存的第一点,因为您有未定义的行为权利现在。
  • 我强烈建议您从您尝试学习 C 的任何资源中修改指针。在我个人看来,一种根据内存本身而不是根据 C 的抽象来解释内存的方法是更可取。

标签: c pointers integer printf dynamic-memory-allocation


【解决方案1】:
  1. calloc(10,1) 分配 10 单字节项而不是 10 整数。所以(除了int为2字节的8位uCs)你分配的内存区域太短了。如果你想为 10 个整数分配空间,你需要 int *p = calloc(10, sizeof(*p));

  2. printf("%d", p) 调用 UB,因为 p 是存储在指针 p 中的引用(地址)。您需要取消引用指针以获取p 指针printf("%d\n, *p); 引用(指向)的整数

要打印存储在指针中的引用,您需要使用正确的格式:printf("%p\n", (void *)p);

【讨论】:

    【解决方案2】:

    有效。

    要打印需要使用 * 取消引用或使用 [] 索引的值。

    printf("%d\n",*p); //p[0]
    printf("%d\n", p[0]); //p[0]
    printf("%d\n",*(p + 1)); //p[1]
    printf("%d\n", p[1]); //p[1]
    

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 1970-01-01
      • 2022-07-30
      • 2013-12-10
      • 2021-04-13
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      相关资源
      最近更新 更多