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


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 行没有。

为什么?请帮忙。

您正在修改 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
    }
}

从函数返回指针(如 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 Listn");
    }
}

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

相关内容

  • 没有找到相关文章

最新更新