2014-11-05 89 views
-1

我想创建一个初始大小为len的新的intarr_t,但我从来没有用typedef'ed变量处理这类问题。在函数中对typedef创建的变量使用malloc

我的问题是intarr_create()应该分配数组空间,然后返回一个指向它的指针,如果malloc成功或者指向NULL,如果我失败了。我怎样才能解决这个问题?

此外,为什么函数中有一个*符号?

这里是我的代码:

#include <stdio.h> 

typedef struct { 
    int* data; 
    unsigned int len; 
} intarr_t; 

intarr_t* intarr_create(unsigned int len) { 
    //intarr_t with initial size len 
    intarr_t = (int *) malloc(len); // not working here, can someone explain why? 
    if(intarr_t != NULL) { 
     return intarr_t; 
    } else { 
     return NULL; 
    } 
} 

int main() { 
    int len = 15; 
    int h = intarr_create(len); 
    printf("%d\n", h); 
    return 0; 
} 
+0

注意,['typedef''ing结构](http://stackoverflow.com/a/4566358/1757964)是C语言的最坏,最可怕的弊端之一。如果你可以避免使用它,请这样做。 – APerson 2014-11-05 19:27:33

+1

您正尝试在'main'的函数调用中将指针类型分配给非指针类型。你也可以直接返回'malloc'的结果,如果你打算在失败时返回NULL,[并且不要强制转换'malloc'的结果](http://stackoverflow.com/questions/605845/do -i-cast-of-malloc) – IllusiveBrian 2014-11-05 19:28:05

+0

@APerson这有点极端,它有一些优点和很少的缺点 – 2014-11-05 19:51:15

回答

2

它不工作,因为你没有给你的变量的名称。另外,int*intarr_t不是相同的类型,所以除非更改演员表,否则将会出现类型不匹配。

+0

改变演员意味着什么? – BeginnerC 2014-11-05 19:30:05

+0

@BeginnerC你写了'(int *)malloc(len)'。 '(int *)'被称为转换;它将'malloc()'调用的类型从'void *'(指向任何内容)改变为'int *'(指向整型变量的指针)。但是你没有一个整数变量,所以你需要把它改成'(intarr_t *)'。您还需要将该变量放入指针中。你最终会得到类似'intarr_t * result =(intarr_t *)malloc(len);' – Kevin 2014-11-05 19:33:56

+0

感谢您的快速响应,但我有点困惑和原谅我的理解缓慢,但因为我想返回一个指向新分配的intarr_t如果成功(即内存分配成功,我会返回结果吗?) – BeginnerC 2014-11-05 19:40:17

1

重写你的函数到这一点:

intarr_t* intarr_create(unsigned int len) 
{ 
    intarr_t *result; 

    result = (intarr_t *)malloc(sizeof(intarr_t)); // allocate memory for struct 
    if(result != NULL) 
    { 
     result->data = (int *)malloc(len * sizeof(int)); // allocate memory for data 
     result->len = len; 
     if (result->data == NULL) 
     { 
      /* handle error */ 
     } 
    } 
    else 
    { 
     /* handle error */ 
    } 

    return (result); 
} 

你必须做一个“双”的malloc得到它的权利。首先,您必须为intarr_t分配内存,如果成功,则必须为数据阵列分配内存。

此外malloc返回一个void *必须被转换为正确的指针类型(应该是一个警告或者甚至可能与一些编译器错误)。

+0

这将返回一个intarr_t结构数组,其中没有为数据分配内存。我不认为这是OP想要的。 – Daniel 2014-11-05 19:33:07

+0

@Daniel根据问题,这正是函数应该做的('我的问题是,intarr_create()应该分配数组空间,然后在malloc成功时返回一个指针,如果失败则返回一个指向NULL的指针。 )...... huups对不起,错过了一下! – 2014-11-05 19:40:45

0

您的intarr_create函数存在一些问题。首先,你需要命名你的intarr_t变量。现在,除了你的intarr结构之外,你还需要为实际的整数数组分配内存。请记住,您必须致电删除两次才能销毁此对象。一旦在数据上,一次在实际结构本身。

intarr_t* intarr_create(unsigned int len) 
{ 
    intarr_t* array = (intarr_t*)malloc(sizeof(intarr_t)); 
    array->data = (int*)malloc(len * sizeof(int)); 

    return array; 
}