2

这个相当简单的代码片段由更大的代码体构成,它给出了“警告:赋值从没有强制转换的指针中生成整数[默认启用]”。

为简单起见,我什至将 caddr_t 更改为 char *... 实际上,这是一组动态生成结构的例程的一部分,在这种情况下,它创建了一个数组,该数组可能包含指向任意 malloc 结构的任意指针。并省略了将 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 开关来告诉它离开而不打扰我?

是的,我更喜欢像一组用于 PDP-11 汇编器的宏的 C ;-)

4

3 回答 3

5

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

然后要么在 calloc 之前删除演员表,要么用 ( char ** )

于 2013-06-26T23:07:51.430 回答
4

您收到警告是因为以下声明:

p[i] = (char *)NULL;

正在分配一个指向整数的指针 -p[i]是一个char. 为了让这个程序正常运行,您需要更改p为 be 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);
}
于 2013-06-26T23:11:09.693 回答
1

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

char *p;

然后您将指针分配(char *)NULL给以下位置的字符char

p[i] = (char *)NULL;

您可能应该使用:

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

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

有些人谴责在malloc()和上使用铸件calloc();我不在那个学校,我曾在需要演员的系统(标准 C 之前)上工作过。我使用选项进行编译,以确保我的代码不会遇到那些谴责演员所害怕的问题。

于 2013-06-26T23:10:12.347 回答