我有一个编写字典的任务。 它将包含x个单词及其定义(由用户输入)。 说明说字典应该是char ***类型(2D数组指针=数组=字符串),但我完全不知道如何动态分配数组的大小。它应该有2行,1个用于单词,另外1个用于它们的定义,列数由字典中的单词数决定。在网上寻求帮助时,我提出了这个问题:
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;
}
我应该在代码中对我的char ***进行哪些更改? 使用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 *是字典[i] [j]。 -
答案 0 :(得分:2)
不要在堆栈上分配free()
任何内容(即buffer
)。
此外,您的函数inputString()
不会告诉其客户端它分配了哪些内存,因为p1
是本地的。
答案 1 :(得分:0)
这是一个例子。
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的参数以适应您的问题/或在您需要更多字符串内存时修改它们。 另外,当你不需要它时尝试释放内存可能是一个好主意
答案 2 :(得分:0)
不要忘记像这样的malloc ......
dictionary[i][j] = (char*)malloc(sizeof(char)*strlen(word_to_insert)+1);
...因为每个单词都以一个填充0“null终止字符串”的补充字节结束。
答案 3 :(得分: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 word\n");
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;
}