【问题标题】:pointer to array , assign array [closed]指向数组的指针,分配数组
【发布时间】:2012-05-08 03:26:35
【问题描述】:
int main() {
    //  int arr[2][2] = { {1,2}, {3,4}};
    int a[] = {1,2};
    int b[] = {3,4};
    int (*ptr)[2];

    // assign ptr to arr
    //ptr = arr;
    ptr = (int (*)[2])malloc (2*sizeof(int));
    ptr = &a;
    (ptr+1) = b;  // error here
     printf("%3d %3d", ptr[0][1], ptr[1][1]) ;
 }

我想要 (ptr+1) 分配一个数组,请帮帮我。 谢谢。

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    ptr 是一个指向 int 数组 (int[2]) 的指针,但是你 malloc 错误的大小,然后通过分配给相同的变量来泄漏内存,从而覆盖了 malloc 内存地址。我假设你想这样做:

    int (**ptr)[2];
    ptr = malloc (2*sizeof(int(*)[2]));
    ptr[0] = &a;
    ptr[1] = &b;
    

    【讨论】:

    • ptr 是指向 int 数组 (int [2]) 等效二维数组 (ptr = arr ) 的指针。因为,我认为 (ptr+1) 将指向一个数组。请解释帮助我,这里有错误。谢谢。
    • pointer != array 您在malloc 中所做的分配是创建一个 2-ints 数组,而不是 2 个 2-ints 数组的分配。
    【解决方案2】:

    您需要使用指针数组,而不是指向数组的指针:

    int main()
    {
        int a[] = {1,2};
        int b[] = {3,4};
        int *ptr[2] = { a, b };
    
        printf("%3d %3d", ptr[0][1], ptr[1][1]) ;
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      完整代码:

      #include <stdlib.h>
      #include <stdio.h>
      
      int main() {
          int a[] = {1,2};
          int b[] = {3,4};
          int **ptr;
      
          ptr = (int **) malloc(sizeof(int *) * 2);
      
          ptr[0] = a;
          ptr[1] = b;
          printf("%3d %3d\n", ptr[0][1], ptr[1][1]);
          free(ptr);
       }
      

      a 和 b 已经是指针(指向整数),所以 ptr 是指向指针(**)的指针。

      【讨论】:

        【解决方案4】:

        你可以这样 malloc。

        #include <stdlib.h>
        #include <stdio.h>
        
        int main(int argc, char *argv[]) {
            int i;
            int a[] = {1,2};
            int b[] = {3,4};
            int *ptr[2];    //same as ptr[2][??]
        
            ptr[0] = (int *) malloc(sizeof(int*) * 2);  //malloc ptr[0] >> 2 * sizeof int
            ptr[1] = (int *) malloc(sizeof(int*) * 5);  //malloc ptr[1] >> 5 * sizeof int
        
            /* so we get ptr[0][2] and ptr[1][5]*/
        
            /* SET VALUE */
            for(i = 0; i < 2; i++)
            ptr[0][i] = i;
            for(i = 0; i < 5; i++)
            ptr[1][i] = i;
        
        
            /* PRINT VALUE */
            for(i = 0; i < 2; i++)
                printf("ptr[0][%03d] = %03d\n", i, ptr[0][i]);
        
            printf("\n");
        
            for(i = 0; i < 5; i++)
                printf("ptr[1][%03d] = %03d\n", i, ptr[1][i]);
        
        
            /* FREE POINTER */
            free(ptr[0]);
            free(ptr[1]);
        
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2015-12-10
          • 2011-04-02
          • 2010-09-25
          • 2013-05-26
          • 2021-12-14
          • 2021-02-07
          • 1970-01-01
          • 1970-01-01
          • 2016-04-19
          相关资源
          最近更新 更多