从不兼容的指针类型C分配

时间:2011-05-11 14:04:43

标签: c pointers

说我想读一页页面 最多19个字符的名称,例如4 (页数)Name1 Name2 Name3 NAME4

我正在尝试使用全局2D数组 存储页码和页面 名字,我得到一个错误说分配 来自不兼容的指针类型...

由于

static int nPages;
static char** pageName;

int main(void){
  scanf(" %d", &nPages);

  pageName = (char *)malloc(nPages*sizeof(char));
  for(int i=0; i < nPages ;i++){
    pageName[i] = (char *)malloc(20*sizeof(char));
    scanf(" %s", pageName[i]);
  }

//Free Memory Here of coz. 

  return 0;
}

5 个答案:

答案 0 :(得分:5)

Never cast the return value of malloc() in C。它隐藏了实际上对你有帮助的编译器警告,而且它永远不必要,所以它只会增加混乱。你应该使用:

pageName = malloc(nPages * sizeof *pageName);

请注意,如何重复pageName的类型名称。这里,sizeof *pageName表示“由pageName指向的对象的大小”,即“字符指针的大小”。您应该经常将sizeof表达式视为malloc()的参数。

此外,sizeof (char)在C中始终为1,因此可以说,特定表达式会增加更多的混乱,而不是有助于使代码安全。

答案 1 :(得分:3)

问题在于:

pageName = (char *)malloc(nPages*sizeof(char));

pageName是char **,而不是char *。所以它应该是:

pageName = malloc(nPages*sizeof(char*)); // sizeof(char *), and no need to cast

编辑:删除了广告

答案 2 :(得分:0)

您定义的pageNamechar **,但在调用malloc初始化指针时,您使用强制转换为(char *)。也许这就是问题所在。

答案 3 :(得分:0)

您要在char*行的第char**行向malloc分配(char*)。只需将void*强制转换C句柄char**自动转换为{{1}}转化。

答案 4 :(得分:0)

char*char**是两种不同的类型,您无法自由地将第一种分配给后者。

话虽如此,你必须进行两步初始化。首先,您需要malloc()空格nPages字符串:

pageName = (char**) malloc(nPages * sizeof(char*));

然后,每个malloc()都需要pageName空格:

for (i = 0; i < nPages; ++i) {
    pageName[i] = (char*) malloc(20);
}