所以,我的代码应该是这样工作的:函数得到一个char**(字符串数组)作为输入,只是char*(字符串),也是int number.然后,我必须将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
}
首先,我必须将char**重新分配给数字,并加到最后..:
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
技术上来说是非法的标识符。
正如评论中提到的,你没有返回你的新指针,所以你在这里泄露了你的新内存,但由于你的代码显然无论如何都不会编译,也许你还有更多的代码没有给我们看。