通过C中的指针将结构传递给函数

时间:2015-03-16 03:17:34

标签: c pointers struct segmentation-fault

typedef struct {  
    int *list;    
} List;

void list_init(List *l, int size) {   
    l=(List*) malloc(sizeof(List));
    l->list = (int*) malloc(size * sizeof(int));  
    l->list[0]=10;   //line 1
}

void main() {
    List *intlist;
    list_init(intlist,3);
    intlist->list[0]=10; //line 2
}

第2行给出了分段错误错误,但第1行没有。

为什么呢?请帮忙。

2 个答案:

答案 0 :(得分:2)

您正在修改list_init中指针的本地副本。它不会更改main中的指针。

我建议(带一些额外的错误检查代码):

List* list_init(int size) {   
    List* l = malloc(sizeof(List)); // Don't cast the return value of malloc
    if ( l )
    {
       l->list = malloc(size * sizeof(int));
       if ( l->list )
       {
          l->list[0]=10;   //line 1
       }
    }
    return l;
}

void main() {
    List *intlist = list_init(3);
    if ( intList && intList->list )
    {
       intlist->list[0]=10; //line 2
    }
}

答案 1 :(得分:1)

从函数返回指针(如R Sahu建议的那样)是一个很好的解决方案。另一个解决方案是发送指向函数list_init的指针。

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

typedef struct {  
    int *list;    
} List;

// returns error code (just as example)
int list_init(List **l, int size)  // the first argument is pointer-to-pointer
{   
    int cnt;
    *l=(List*) malloc(sizeof(List));  // it is not a problem to cast poiter type
    if( *l == NULL )
    {
        return 1; // 1 means problem with allocation memory for List 
    }
    (*l)->list = (int*) malloc(size * sizeof(int));  
    if( (*l)->list == NULL )
    {
        return 2; // 2 means problem with allocation memory for int-list 
    }
    for(cnt = 0; cnt < size; cnt++)
    {
        (*l)->list[cnt] = 0;   // let it be 0 for all elements
    }
    return 0; // 0 means NO problems with allocation memory
}

int main(void) 
{
    List *intlist;
    if ( list_init(&intlist,3) == 0 ) // give address of intlist to function and check the result
    {
        intlist->list[0]=10; // now it works
    }
    else
    {
        printf("Memory cannot be allocted for List\n");
    }
}

此解决方案对于函数返回其他内容但也应分配内存并更改指针的情况非常有用。