2014-10-02 77 views
1

我有一个简单的结构。指向指向c中结构的指针

struct grades 
{ 
int lowest; 
int highest; 
}; 

然后,我要创建一个函数,该函数返回一个初始化结构的指针。

struct *grades setGrades(int low, int high) 
{ 
    struct *ptr = malloc(sizeof(struct grades)); 
    ptr->lowest = low; 
    ptr->highest = high; 
    return ptr; 
} 

现在我应该使一个函数定义与struct **grades random(int size); 我应该为指针数组以grade结构具有等于size元件的数量分配空间。当创建指针数组时,我想将数组中的每个指针设置为一个新创建的数据结构,该结构的低变量等于10,高变量等于100,然后返回指针。

在这一点上,我真的迷失了,因为我在网上查找结构的双指针,但没有找到任何可以帮助我清楚理解的例子。我在想,如果有人能够向我解释结构的双重指针是如何工作的,它会给我一个正确方向上的好开始。

+7

'struct * grades'和'struct * ptr' ??? – isedev 2014-10-02 14:42:47

+1

更好的函数名称将是'createGradeSet',因为每次调用时都会返回一个新结构。 – 2014-10-02 14:45:02

+0

编辑。该函数只是返回一个将初始化等级结构的指针。我故意做了一个简单的问题,更多的指针密集,所以我可以学习。我知道你可能会认为他为什么这样做?@isedev是否应该被命名为别的东西? – user1010101 2014-10-02 14:45:12

回答

2

你称之为“双指针”只是一个指向指针的指针。就是说,struct grade example是一个包含lowesthighest的变量,如您所定义的那样。一个指针,struct grade *example是一个变量,用于存储相同结构的内存地址。指向指针的指针struct grade **example是一个变量,用于存储存储结构内存地址的变量的内存地址。更详细的解释可以参见here。不管怎么说,回答您的具体问题,一个函数是:

struct grades** random(int size) { 
    struct grades** result = malloc(sizeof(struct grades*) * size); //here you are 
                //allocating enough space for an 
                //array of pointers 
    int i; 
    for(i = 0; i < size; i++) { 
     result[i] = setGrades(10, 100); //here you are setting each pointer to one 
             //grade through the function you've already 
             //defined 
    } 

    return result; 
} 
+0

如何打印由doule指针设置的值以检查它是否已设置? – user1010101 2014-10-02 15:36:56

+1

对于单个指针,您会打印'result-> lowest',是否正确?对于指向指针的指针,你需要使用'result [i] - > lowest''。在这里,'result [i]'是指向等级的指针数组中的第i个指针。 – wolfPack88 2014-10-02 15:43:36

2
struct grades { int lowest; int highest; }; 

struct grades * createGradeSet(int low, int high) //careful: return type is struct grades * 
{ 
    // variable name: ptr, type: struct grades * 
    struct grades * ptr = malloc(sizeof(struct grades)); 
    ptr->lowest = low; 
    ptr->highest = high; 
    return ptr; 
} 

struct grades ** random(int size) 
{ 
    // Create a pointer to an array of struct grades pointers 
    // the size of the array is `size` x the size of a struct grades pointer 
    struct grades ** ptr_arr = malloc(sizeof(struct grades *) * size); 
    for (unsigned int i = 0; i < size; i++) 
    ptr_arr[i] = createGradeSet(10, 100); // assign a newly created Gradeset to every cell 
    return ptr_arr; 
} 
1

请尝试以下

struct grades ** random(size_t size) 
{ 
    if (size == 0) return NULL: 

    struct grades **p = malloc(size * sizeof(struct grades *)); 

    if (p != NULL) 
    { 
     size_t i = 0; 
     do 
     { 
      p[i] = malloc(sizeof(struct grades)); 
      if (p[i] != NULL) 
      { 
       p[i]->lowest = 10; 
       p[i]->highest = 100; 
      } 
     } while (p[i] != NULL && ++i < size); 

     if (i != size) 
     { 
      for (size_t j = 0; j < i; j++) free(p[i]); 
     } 
     free(p); 
     p = NULL;  
    } 

    return p; 
}  

功能setGrades应该写成

struct *grades setGrades(int low, int high) 
{ 
    struct *p = malloc(sizeof(struct grades)); 

    if (p != NULL) 
    { 
     p->lowest = low; 
     p->highest = high; 
    } 

    return p; 
} 

在这种情况下,while循环了吗在上面的函数中可以写成

 do 
     { 
      p[i] = setGrades(10, 100); 
     } while (p[i] != NULL && ++i < size); 
+1

请注意,检查'malloc()'的返回值不能保存你的程序不再崩溃:现代内核提交它们的内存,所以'malloc()'在正常情况下不会返回NULL。该程序既不会崩溃也不会有机会认识到没有内存来支持它的分配,当内核意识到内存不足时它会被拍摄。因此,检查'malloc()'的返回值远远不如以前那样明智。特别是考虑它如何混淆你的代码。 – cmaster 2014-10-02 15:14:30

+0

@cmaster这只是一个愚蠢的事情。 – 2014-10-02 15:20:50

+0

不,我不这么认为:内核基本上不可能知道它何时过度使用内存,如果使用保守策略,实际使用所有可用内存几乎是不可能的。考虑分叉的影响:理论上,新流程需要与旧分区一样多的内存。因此,在保守的政策下,如果您的流程已经占据了一半的内存,您将无法分流。但是在由于system()调用而产生的fork中,fork会立即释放继承的内存。所以内核不应该阻止你的进程分叉。 – cmaster 2014-10-02 15:48:22