说我想读一页页面 最多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;
}
答案 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)
您定义的pageName
为char **
,但在调用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);
}