好吧,我猜有很多误解。那里的大多数代码都是不正确的。您要求输入 11 个字符串,因此char Answers[10][100];
不正确,您应该输入char Answers[11][100];
,这就是它跳过输入的原因。关于错误...首先 -calloc()
有两个参数,而不是一个,如malloc()
,如以下签名中所示:
void *calloc(size_t nmemb, size_t size);
返回 avoid*
分配的内存区域,第一个参数是您要分配的元素数量,第二个参数是每个元素的大小。其次,如上所述,它返回一个 POINTER,一个 void 指针,因此您无法正确执行这段代码:
char Answers[10];
for(c=0;c<=10;c++)
{
Answers[c] = calloc(11*sizeof(char));
}
有什么问题 ?首先,参数,如前所述。但第二个事实是您根据需要制作了一个字符数组而不是 CHAR POINTERS。应该是这样的:
char* Answers[11]; //As you requested 11 elements
for(c=0;c<=10;c++)
{
Answers[c] = (char*) calloc(1, MY_STR_LENGTH);
}
当 MY_STR_LENGTH 是常数 100 时,如您的示例所示。我们在 void 指针上使用了强制转换,我们更正了calloc
char 指针的使用和声明。现在这段代码是正确的——还有,你为什么要使用calloc
?通常不需要在字符串中这样做。顺便说一句,无论如何,当它是一条线时就不需要函数。第二种声明方式是这样的:
char **Answers = calloc(11, sizeof(char*));
for(i = 0 ; i < 11 ; i++)
{
Answers[i] = calloc(1, sizeof(char)*MY_STRING_LENGTH); //Basically it is MY_STRING_LENGTH as sizeof(char) is almost always one, but it's there only for the readability of the code.
}
就是这样,希望你能理解。在此处阅读有关 C 中内存分配的更多信息:
关于malloc()
关于calloc()
关于realloc()