通过双指针强制分配内存

时间:2014-12-31 17:11:30

标签: c pointers casting

我不清楚当你通过双指针转换分配的内存时会发生什么,如:

char **ptr;
ptr=(char *)malloc(sizeof(char)*value); 
for(i=0;i<value;i++)
   ptr[i]=(char **)malloc(sizeof(char *)*another_value);

在第一次调用malloc时,void *被转换为char *所以,我可以使用*(ptr + i)访问它,但是在malloc的第二次调用期间我不明白为什么我需要将void void *转换为char **,不足以将其转换为char *?

5 个答案:

答案 0 :(得分:5)

在上面的片段中进行投射毫无意义。 Do not cast return value of malloc。分配也是错误的。应该是这样的:

ptr = malloc(sizeof(char*)*value);  

ptr[i] = malloc(another_value); 

答案 1 :(得分:3)

两者都错了。

两个强制转换都是不必要的,因为void指针(malloc返回void*)与任何其他数据指针兼容。

请参阅:http://c-faq.com/malloc/cast.html

答案 2 :(得分:0)

你做错了。

首先不需要投射malloc()请查看下面的更改。

由于malloc()的返回类型为void *,因此无需投射malloc()

char **ptr = (char **)malloc(sizeof(char *)*another_value);

for(i=0;i<value;i++)
ptr[i]=(char *)malloc(sizeof(char)*value);

删除演员并

char **ptr = malloc(sizeof(char *)*another_value);

for(i=0;i<value;i++)
ptr[i]= malloc(sizeof(char)*value);

答案 3 :(得分:0)

正确的方法是

char **ptr;
ptr = malloc(sizeof(char *) * value); // value pointers of char
for(i=0;i<value;i++)
    ptr[i] = malloc(sizeof(char)*another_value); // another_value of chars

您的代码已编译,因为void *会自动转换为任何指针类型,但如果您打开警告,编译器会通知您正在分配不兼容类型的指针。

没有演员阵容但不会发出警告。

另一件事,sizeof(char) != sizeof(char *)你需要value指向char,然后每个指针指向another_value char个数组。

所以第一次调用malloc你必须分配value * sizeof(pointer),其语法是

value * sizeof(char *)
/*                  ^ see the star here. */

然后您不需要sizeof(char),因为它是1,以下是正确的

char **ptr;
ptr = malloc(sizeof(char *) * value); // value pointers of char
for(i=0;i<value;i++)
    ptr[i] = malloc(another_value); // another_value of chars

答案 4 :(得分:-3)

将malloc返回的void指针强制转换为目标指针的类型是个好主意。在这种情况下,您可以在代码段中找到类似于错误的错误。

char **ptr;
ptr=(char *)malloc(sizeof(char)*value); 

此处变量ptr的类型为char **,而赋值语句的右侧由于转换而具有类型char *。因此,编译器应发出错误(更确切地说是诊断消息),因为char *没有隐式转换。到char **

顺便说一下,在C ++中,不允许将类型为void *的指针分配给其他类型的指针,因为这样的代码是不安全的。

转换malloc返回的void指针的另一个原因是使代码自我记录。例如,考虑以下陈述

p = malloc( sizeof( *p ) );

这里很难理解分配的内存类型。写例如

会好得多
p = ( double * )malloc( sizeof( *p ) );

在这种情况下,语句更清晰,您无需滚动大型程序列表来确定p的类型。

考虑到一个好的程序是一个程序,其中每个语句为您提供所需的信息,以便了解该语句试图做什么以及表达式中包含哪些类型的变量。

还有一个理由来强制转换malloc返回的指针。如果您尝试使用C ++编译器编译代码,那么每次使用malloc时都会发出很多错误而不进行强制转换。当您将代码从C转移到C ++时,您将估计此类转换的值。

以下是为您的示例正确使用malloc

char **ptr;

ptr = ( char ** )malloc( value * sizeof( char * ) ); 
for ( i = 0; i < value; i++ )
   ptr[i] = ( char * )malloc( another_value * sizeof( char ) );