在ANSI C中dynamic分配任意指针的数组

这个相当简单的代码片断是由一个大得多的代码构成的,它给出了“警告:赋值使得整数不受指针的影响(默认情况下启用)”。

为了简单起见,我甚至将caddr_t改为char * …实际上,这是一组dynamic生成结构的例程的一部分,在这种情况下创build一个可能包含任意指向任意malloc'd结构的指针的数组。 并省略calloc'd数组插入的结构。

这是我在80年代做OO的方式,而且我有很多这样工作的代码。

#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int n = 10; int i; char *p; p = (char *) calloc(n,sizeof(char *)); for (i=0; i<n; i++) {p[i] = (char *) NULL;} } 

那么有没有一种简单的方法来使现代的C快乐,或者我必须使用-W开关来告诉它离开而不打扰我?

是的,我更喜欢一个C,就像PDP-11汇编器的一组macros;-)

你应该声明pchar ** p ,如果你想要一个指针数组。

然后,在calloc之前移除cast或者使用(char **)

您收到警告,因为这个声明:

 p[i] = (char *)NULL; 

分配一个指向一个整数的指针 – p[i]是一个char 。 为了让这个程序正确运行,你需要把p改成char ** ,而不是char * 。 那就是 – 它应该是一个指向字符串的指针数组,而不是一个指向字符数组的指针。

另外,还可以去掉sizeof运算符中的那些类型转换和括号。

 char **p = calloc(n, sizeof *p); 

 p[i] = NULL; 

是更容易阅读。

更妙的是,由于空指针常量几乎可以肯定是你的机器上的全零位模式,所以你根本不需要完成这个任务的循环 – calloc调用已经为你的内存清零了。

假设情况如此,这里有一个与你的语义相同的简化程序:

 #include <stdlib.h> int main(void) { int n = 10; char **p = calloc(n, sizeof *p); } 

编译器不高兴的原因是你有:

 char *p; 

然后你分配指针(char *)NULL到字符char在:

 p[i] = (char *)NULL; 

你可能应该使用:

 char **p = (char **)calloc(n, sizeof(char *)); 

但是如果你使用calloc() ,无论如何,后续的循环是多余的(除非你是在一个奇怪的机器上,空指针的内存中表示不是全部为零,但你可能不应该使用calloc()简单地使用malloc() )。

有些人在malloc()calloc()上使用强制转换。 我不在那所学校里,曾经在那些需要演员的系统(预标准C)上工作。 我编译的选项可以确保我的代码不会遇到那些排斥剧组的人害怕的问题。