我毕业后学习C并尝试刷新旧技能。我目前正在尝试创建一个动态分配的数组,该数组由动态分配的字符串组成。下面是我的代码,我试图在先前初始化的数组中添加一个形容词,其中第一个成员为NULL。最后一个成员应该始终为NULL。
char **addAdjective(char **array, const char *adjective)
{
int i = 0;
int count = 0;
while (*array != NULL){
array++;
count += 1;
}
array = (char**) realloc(*array, sizeof(*array) * (count+2));
int adjectiveLength = strlen(adjective);
array[count] = (char*) malloc(sizeof(const char)*(adjectiveLength + 1));
for (i = 0; i < adjectiveLength; i++){
array[count][i] = adjective[i];
}
array[count][i+1] = '\0';
array[count+1] = NULL;
return array;
}
当我用以下方式调用上述内容时:
adjectives = addAdjective(adjectives, "beautiful");
adjectives = addAdjective(adjectives, "ugly");
adjectives = addAdjective(adjectives, "sweet");
似乎有些不对劲,因为当我试图打印数组时我什么都没得到。
可能出现什么问题?
编辑:
打印功能应该没问题:
void printAdjectives(char **adjectives)
{
if (!adjectives)
return;
while (*adjectives) {
printf("%s ", *adjectives);
adjectives++;
}
printf("\n");
}
初始化:
char **initAdjectives(void)
{
char **adjectives = (char **)malloc (1 * sizeof(char *));
*adjectives = NULL;
return adjectives;
}
答案 0 :(得分:1)
array[count][i+1] = '\0';
应该是
array[count][i] = '\0';
或更好
array[count][adjectiveLength] = '\0';
请注意,当代码到达该行i==adjectiveLength
时。
您分配了adjectiveLength+1
个字符,写入i+1
已超出分配空间的末尾。
我不知道这是否是您唯一的错误,但这是非法的。