我有一个声明为
的指针数组char (*c)[20]
使用malloc
分配内存时c=malloc(sizeof(char)*20);
或
c=(char*)malloc(sizeof(char)*20);
我收到“可疑指针转换”的警告
为什么?
答案 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风格的编译器中,上面的一个是有效的和预期的。