既然您提到您是一名 Java 程序员,您应该研究一下 C 内存分配(在本例中尤其是字符串)是如何工作的:
char *vysledek = "";
在 Java 中,这将创建一个字符串对象,您可以在其中随意添加字符。然而,在 C 中,这基本上会创建一个数组char[1]
,包含'\0'
(字符串终止符)。
因为像 Java 的数组一样,您不能(不应该)在数组边界之外进行写入,因此您可以在该数组中存储一个字符,但该数组的内存不足以支持您的函数。
您可以通过首先迭代输入来找出需要分配多少内存(正如 Nit 在他的评论中提到的)。然后你可以malloc
输出指针所需的内存:
vysledek = malloc (<output string length>);
现在您已经分配了足够的内存,您可以将输出写入这个数组,所以而不是
printf("%c", src[i - pom]);
你现在可以写:
vysledek[vysledek_counter++] = src[i - pom];
并返回指针。
请注意,您should使用完返回值后释放它,即使它位于 main 方法的末尾,它应该如下所示:
int main(int argc, char * argv []) {
char *output;
output = decompress("Hel2o world!10");
printf("%s\n", output);
free(output);
return 0;
}
要添加的一项附加说明:如果您的代码遇到非终止字符串(即,没有'\0'
指示字符串结尾的字符)。为了解决这个问题,请传递一个附加的字符串长度参数(您必须设置'\0'
返回中的角色char
数组,并为此指针保留一个额外的内存字节)。它在第一次迭代中也有未定义的行为(正如 Cool Guy 指出的那样),如pom
总是至少为 1,导致i - pom
,因此尝试访问src[-1]
.