【问题标题】:How to declare a dynamic integer array in ANSI - C using malloc and put input integers into it?如何使用 malloc 在 ANSI-C 中声明动态整数数组并将输入整数放入其中?
【发布时间】:2013-04-16 11:34:02
【问题描述】:

首先我希望用户输入所需数组的大小。 所以我正在使用:

int size;
scanf("&d",&size);

现在我想使用指针和 malloc 函数创建一个整数数组。 这就是我所做的:

int *p1 = (int*)malloc(sizeof(int)*size);

据我了解,这就像使用:

int p1[size];

但是如何像数组一样使用它呢?

问题 1: 现在我希望用户输入与他写入这个“数组”一样多的整数。 但是我不能使用 p[0] 因为它不是一个数组,它是一个指针。

问题 2: 我想将此数组“发送”到一个获取整数数组的函数。 再说一遍,这不是一个数组,我怎么能把它“给”给函数呢?

【问题讨论】:

  • 是否 scanf("%d",&p1[0]);给你任何错误?这应该工作
  • 提示:一个指针保存一个地址,它是scanf() 需要用于slurping 数据的地址。所以..scanf("%d", p1+n),其中n 是正在读取的元素。
  • 请注意,除非您的编译器是古老的,否则没有什么能阻止您将数组声明为 int p1[size];,其中 size 具有在运行时分配的值。

标签: c arrays pointers malloc ansi


【解决方案1】:

第一个问题的答案:

for(i = 0; i < size; i++ )
{
   scanf("%d",&p[i]); 
   /*p[i] is the content of element at index i and &p[i] is the address of element 
at index i */
}

或者

for(i = 0; i < size; i++ )
{
   scanf("%d",(p+i)); //here p+i is the address of element at index i
}

第二个问题的答案:

要将此数组发送给函数,只需像这样调用函数:

function(p); //this is sending the address of first index of p

void function( int *p ) //prototype of the function

【讨论】:

    【解决方案2】:
    • 问题 1:一维数组和指向正确分配内存的指针几乎是一回事。
    • 问题 2:将数组传递给方法时,实际上是在传递该数组的第一个元素的地址

    数组实际上是指向数组第一个元素的指针

    【讨论】:

    • 我知道这是一回事,这就是为什么我要问如何像数组一样使用它?假设我想使用:scanf("%d",&p[0]);但是 p 是一个指针,所以我做不到。对吗?
    • scanf("%d",&p1[0]);和 scanf("%d",p1 + 0);应该做的伎俩
    • @Tom 他们是一回事。固定数组是所述数组的第一个元素的内存地址的程序化标签。指针是一个独立的变量,它持有一个地址。在后者中,地址 value 是可变的,在前者中它是 notint a, *p=&amp;a; p++; 是合法的。 int a[2]; a++;不是
    【解决方案3】:

    您可以使用subscript-syntax 来访问指针的元素。

    p1[3] = 5; // assign 5 to the 4th element
    

    但是,这个语法其实是转换成下面这样的

    *(p1+3) = 5; // pointer-syntax
    

    对于第二个问题,定义一个函数并传递一个指针

    int* getarray(int* p1, size_t arraysize){ } //define the function
    
    int* values = getarray(p1, size); // use the function
    

    【讨论】:

      【解决方案4】:

      很抱歉打扰大家,但 Upasana 小姐是对的,这是使用动态数组的正确方法。通过 malloc 声明你的数组后,你可以直接使用它,就像数组一样::

             for(int i = 0; i < size; i++ )
          {
             scanf("%d",p+i); 
             /*p+i denoting address of memory allocated by malloc */
          }
      

      第二个答案: 现在只需将此地址传递给任何函数使用地址即可找到如下值:

      function(int *p)
      /* access as &p for first value &p+2 for second p+4 for third and so on*/
      

      【讨论】:

      • 所有这些都是非常不正确的。我建议阅读有关数组和指针的内容,尤其是 指针算法
      • 你能告诉我为什么它是错的或者它有什么问题吗@Lundin。因为我所知道的一切都是正确的..
      • 因为指针算法考虑了指向类型。它不会在您似乎相信的字节级别上执行算术运算。即使是这样,也不能保证 int 是 2 个字节。
      • @Lundin 你的意思是它存储的指针是另一种类型(可能是字节级别的东西),我们不能在算术表达式中使用,但可以像任何其他整数常量一样打印它们。我认为指针也需要空间来存储地址,如果它们存储在内存中并且可以正常打印或获取,那么也可以正常计算。顺便说一句,如果您检查它并且出现一个问题,那么当我们说无符号/有符号整数而不是 long int 或任何其他整数时,为什么您说整数是两个字节?请解释你的答案..
      • 不,我的意思是 int* ptr; .... ptr + 1 的意思是“给我 ptr 的地址加上一个 int 的大小(可以是 2 字节或 4 字节等)。这称为指针算术,非常基本的东西。阅读 C 书籍中的指针章节。
      猜你喜欢
      • 2018-01-19
      • 2013-10-09
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多