所以我的代码应该这样运行:该函数将输入char **(字符串数组)作为输入,而只是char *(string)作为输入,也是整数。然后,我必须将char **重新分配给该数字,并将字符串添加到他的最后一个指针中。这是我的写法:
void addReason(char** stringsArr, char* string, int number)
{
stringsArr = (char**)realloc(type, sizeof(char) * number);
*(stringsArr + number - 1) = (char)malloc(sizeof(char) * strlen(string));
strcpy(*(stringsArr + number - 1), string); // the exception thorws here,
//talking about the *(stringsArr + number - 1) pointer
}
第一:
stringsArr = (char**)realloc(type, sizeof(char) * number);
应该是:
stringsArr = realloc(stringsArr, sizeof(char *) * number);
甚至更好:
stringsArr = realloc(stringsArr, sizeof(*stringsArr) * number);
请注意sizeof
运算符的参数,不要将realloc
或malloc
的返回值强制转换。
第二:
*(stringsArr + number - 1) = (char)malloc(sizeof(char) * strlen(string));
应该是:
stringsArr[number-1] = malloc(strlen(string) + 1);
sizeof(char)
根据定义为1,因此无需指定。您需要为终止null添加1。数组索引符号通常比指针符号更易于遵循。
第三,偶然地,reason
实际上是有效的标识符,而不是复制粘贴错误:
strcpy(*(stringsArr + number - 1), reason);
应该是:
strcpy(stringsArr[number - 1], string);
作为附加点:
您应该始终检查malloc
和朋友的返回值。
所有以str
开头的标识符和小写字母都保留用于标准库,因此stringsArr
和string
从技术上讲是非法标识符。
如评论中所述,您不会返回新指针,因此您将新内存泄漏到这里,但是由于您的代码显然仍然无法编译,因此可能还有更多代码没有显示给我们。