在C中为指向数组的指针分配内存

时间:2012-01-16 15:23:56

标签: c

我有一个声明为

的指针数组
char (*c)[20]

使用malloc

分配内存时
c=malloc(sizeof(char)*20);

c=(char*)malloc(sizeof(char)*20);

我收到“可疑指针转换”的警告

为什么?

5 个答案:

答案 0 :(得分:5)

在此声明中

char (*c)[20];

c对象的类型为char (*)[20]

我们知道在C malloc中,返回类型为void *,并且void *与任何对象指针类型之间存在隐式转换。

因此c = malloc(whatever_integer_expression)在C中有效。如果收到警告,您可能正在使用C ++编译器,或者您正在使用C编译器,但忘记包含stdlib.h标准头。

但是c = (char*) malloc(whatever_integer_expression)无效C,因为char *类型和char (*)[20]类型之间没有隐式转换。编译器必须(至少)警告。

答案 1 :(得分:1)

首先,请确保包含stdlib.h

其次,尝试将其重写为

c = malloc(sizeof *c);

我怀疑您在第二种情况下获得诊断,因为char *char (*)[20]不兼容。不知道为什么第一个案例会抱怨(在编译时,无论如何),除非你没有包含stdlib.h

修改

请记住,在应用下标之前,您必须取消引用指针;也就是说,你的表达必须是

(*c)[i] = val;
printf("%c", (*c)[j]);

等。

或者你可以用c[0][i]来代替(*c)[i],但如果c不应该像2-d一样,那可能更多会让人感到困惑阵列。

答案 2 :(得分:1)

因为您将C定义为指向静态字符数组的指针,而不是指向字符数组的指针,即指向第一个字符的指针。

更改

char (*c)[20];

代表

char * c;

答案 3 :(得分:0)

对于20个字符的数组,计算NUL终止符,您不需要指针

char array[20];

对于指向char的指针,您不需要数组

char *pointer;

指向char的指针可以指向数组

pointer = array;

到数组的一部分(假设与NUL终结符没有'有趣'的业务)

pointer = &array[10];

或用malloc

分配的一堆字节
pointer = malloc(20);

答案 4 :(得分:0)

只需使用

c=(char(*)[20])malloc(sizeof(char)*20);

原因:

1,正如@ouah所说。

2,在K& R风格的编译器中,上面的一个是有效的和预期的。