【问题标题】:C memory allocation(malloc) [closed]C内存分配(malloc)[关闭]
【发布时间】:2015-02-11 05:23:14
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *p, n, i;
    printf("Enter the size of the array:");
    scanf("%d", &n);
    p = (int *)malloc(n * sizeof(int));
    for (i = 0; i < n; i++)
    {
        printf("\n Enter element %d:", i + 1);
        scanf("%d", &p[i]);
    }
    for (i = 0; i < n; i++)
        printf("\n %d", p[i]);
    return 0;
}

为什么我们需要在scanf中写&amp;,如果是数组就不需要了? p 是指向所有内存空间的指针,所以 &amp;p[i] 应该给出指针的地址,而不是我们想要存储数据的位置,对吧? 此外,如果我们在printf 中写入*p[i],它会给出错误,p 是一个指针,所以我们应该尊重它并将数据存储在内存中的保留空间中,但它不起作用?即使我按原样编译上述程序,在输入 3 个值后它也会停止工作。

【问题讨论】:

  • 您为程序提供的确切输入是什么?您得到的确切结果是什么?
  • p 是一个指针,所以我们应该尊重它”:我们这样做,通过使用与*(p + i) 相同的p[i]
  • @DavidSchwartz 没有。元素数:5 我可以输入 ele 1、ele 2 和 ele 3,但随后它显示程序不工作并停止。
  • @glglgl 如果 p 是一个指针,那么 &p[0] 应该给出指向 element[0] 的指针的地址,而不是 element[0] 的内存地址?

标签: c


【解决方案1】:

下标运算符 [] 也执行取消引用。它一次执行索引和取消引用。 p[n] 等效于 *(p+n),即它转到一个偏移量并取消引用它。因此,&amp;p[n] 等价于p+n

【讨论】:

  • 是下标操作符,不是解引用操作符。 (也没有什么叫做“解引用操作符”,尽管一元 * 操作符确实解引用了一个指针。)
  • 感谢正式用语。为了避免误解,我做了一些修改。
  • 好吧,*p[i]**(p+i) 一样错误。正如其他人所说,您试图取消引用不是地址的东西(p[i] 是一个普通的 int,如i)。并且:我所说的“&p[n] 等同于 p+n”就是这个意思。这两个表达式是等价的。当我说p+n 是 p 处元素之后的第 n 个元素的 address 时,也许它会有所帮助?由于p[n] 是第n 个元素,&amp;p[n] 在逻辑上也是第n 个元素的地址。
  • @PeterSchneider int arr[]={1,2,3,4,5} 现在如果我们执行 int *p=arr;那么 p[i] 和 arr[i] 基本上是一样的吧?现在我们在这里创建了一个内存空间,并且指针指向内存空间,所以我们可以使用 p[i] 或 arr[i] 来访问一个元素,这就是我们的意思吗?现在说我们想要指针地址,那么我们应该在 printf 中写什么?
  • 你说的都是对的。 “现在说我们想要指针地址”:你真的想要指针 address 吗? 可能你想要指针 value。指针 p 是一个普通变量,它包含一个普通值,很像一个 int。在通用平台上,该值将是 4 或 8 个字节长。那里没有魔法,只是有点模式。您可以将其解释为 int,例如打印号码。这个数字的含义很有趣:这个数字是内存位置的“地址”。这就是 scanf 需要的:内存位置的地址。要更改 arr 的第一个元素 1,只需写 scanf("%d", p)
【解决方案2】:

如果值为p[i]

p[i] = *(p+i)

那么位置应该是

&p[i]

所以你需要指定你需要存储这个值的位置,它将是&amp;p[i]

(p+i)

&p[i] = (p+i)

【讨论】:

  • 不要把事情复杂化:&amp;p[i] == &amp;*(p+i) == (p+i)
  • @BeyelerStudios 我用另一种方式表达了!!我认为这里没有什么复杂的
  • 你刚刚添加了一个错误:&amp;(p+i)(p+i)不一样
  • @BeyelerStudios 哎呀,修复了它
  • @Gopi 当我们使用 malloc 动态分配内存时,我们是否会创建一个具有特定编号的数组。保留空间还是指向保留空间的指针?如果是指针,我们使用 &p? 找到指针的地址?
【解决方案3】:

为什么我们需要在scanf中写&,如果是数组就不是 有必要吗?

数组衰减到第一个元素的指针。一般一个表达式a,其中a是一个数组,变成&amp;a[0]

另外,如果我们在 printf 中写 *p[i],它会报错,p 是一个指针,所以 我们应该尊重它并将数据存储在保留空间中 内存,但它不工作?

不,您正在尝试将一元 * 运算符应用于不是指针类型的东西。 E1[E2] 形式的表达式等价于 (*((E1)+(E2))),因此如果 * 产生的不是指针类型,则语法无效。

【讨论】:

  • 1. P 是指向数组的指针,所以 &p 应该显示指针地址而不是元素的内存地址? 2.说 int *p=&a; a=5; *p=8 printf("%d",*p);它应该正确打印 8 但 8 不是指针但它仍然显示正确答案?
【解决方案4】:

你需要写&amp;n 告诉scanf 把数据放在哪里。 &amp;是地址操作符,返回变量存放的内存地址。

&amp;p[i] 将给出数组中ith 元素的地址。

【讨论】:

  • 它不是引用运算符。 C中没有引用。C++中也不叫引用运算符。
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2013-02-23
  • 2012-10-10
  • 2020-11-01
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多