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");
}
}
此解决方案对于函数返回其他内容的情况很有用,但也应该分配内存并更改指针。