我有一项任务要做一本字典。它将包含x个单词及其定义(由用户输入)。指令说字典的类型应该是char***(指针的2D数组=数组=字符串),但我完全不知道如何动态分配数组的大小。它应该有两行,一行用于单词,另一行用于定义,列的数量由字典中的单词数量决定。在网上寻求帮助时,我想到了这个:
char** AllocateArray(int line, int column)
{
char** pArray=(char**)malloc(line*sizeof(char*));
int i;
for(i=0;i<2;i++)
pArray[i]=(char*)malloc(column*sizeof(char));
return pArray;
}
我应该对代码进行哪些更改,使其能够使用我的字符***?使用Visual studio 2012
编辑:
我现在有一个问题:
void inputString(char* p1)
{
char buffer[80];
printf("nEnter a word:");
scanf("%s",buffer);
p1=(char*)malloc(strlen(buffer)+1);
if(p1!=NULL)
{
strcpy(p1,buffer);
free(buffer);
}
}
我输入一个单词后它就崩溃了。函数接收的char*是dictionary[i][j]。–
不要free()
堆栈上分配的任何内容(即buffer
)。此外,函数inputString()
不会告诉它的客户端它分配了什么内存,因为p1
是它的本地内存。
下面是一个例子。
char*** dictionary;
int i = 0;
int j = 0;
int lines = 10;
dictionary = (char***)malloc(sizeof(char**)*lines);
for(i=0;i<lines;i++)
{
dictionary[i] = (char**)malloc(sizeof(char*)*4);
for(j=0;j<4;j++)
dictionary[i][j] = (char*)malloc(sizeof(char)*25);
}
您必须修改malloc的参数以适应您的问题/或在需要更多内存用于字符串时修改它们。此外,当您不需要
别忘了这样malloc。。。
dictionary[i][j] = (char*)malloc(sizeof(char)*strlen(word_to_insert)+1);
因为每个单词都以一个补充字节结尾,该字节填充有0"空终止字符串"。
样本
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char ***dictionary;
const char *words[] = { "ASEAN", "United Nations", "OPEC" };
size_t howManyWords = sizeof(words)/sizeof(*words);
int i;
dictionary = malloc(howManyWords*sizeof(char**));
printf("Please enter the definition of this wordn");
for(i = 0; i < howManyWords; ++i){
char buff[80];
char **keyValue;
printf("%s : ", words[i]);
fgets(buff, sizeof(buff), stdin);
keyValue = malloc(2*sizeof(char*));
keyValue[0] = (char*)words[i];
keyValue[1] = malloc(strlen(buff)+1);
strcpy(keyValue[1], buff);
dictionary[i] = keyValue;
}
//print
for(i=0;i<howManyWords;++i){
printf("%s : %s", dictionary[i][0], dictionary[i][1]);
}
//release
for(i=0;i<howManyWords;++i){
free(dictionary[i][1]);
free(dictionary[i]);
}
free(dictionary);
return 0;
}