我正在尝试用C编写一个小程序,但我不得不试图增加一个int
。
#include<stdio.h>
#include<string.h>
char * compress(char *input, int size){
char *inputCopy;
char compressedString[100];
snprintf(inputCopy, size, "%s", input);
int i = 0;
int counter;
int j;
while(i < size){
counter = 1;
j = i;
while (inputCopy[j] == inputCopy[j + 1] && j < size){
j++;
printf("same! \n");
counter++; // When this line is commented out it works.
}
if (i != j){
i = j;
}else{
i++;
}
}
return inputCopy;
}
main(){
char test[10] = "aaaaaaasdd";
printf("%s \n", compress(test, 10));
printf("%s", test);
return 0;
}
counter++
线由于某种原因使我的程序崩溃。我知道这可能很简单,但有人能指出我为什么这不起作用?
你没有为snprintf
分配数据。 inputCopy
是未初始化的,所以它可能是在写counter
使用的内存。确保分配必要的内存。
与此崩溃无关,但您可能会无效读取(inputCopy[j + 1]
)。切换j < size
到(j + 1) < size
并将它移动到while
的开头,这样你就会短路。
如果您使用的是Linux系统,valgrind
(或Clang的地址清理程序)可以帮助解决这两个问题。
你需要首先检查j < size
,并将其加强到j + 1 < size
,否则你冒着越界数组访问的风险,这是未定义的行为:
while (j + 1 < size && inputCopy[j] == inputCopy[j + 1]){
(只有当&&
为1时,才会评估j + 1 < size
的右手参数。)
为inputCopy
分配的内存在哪里?
在这里,您将test
定义为长度为10的数组:
char test[10] = "aaaaaaasdd";
然后你将它传递给compress
,其中10为size
:
printf("%s \n", compress(test, 10));
当i
为0到9时,此条件将保持为真:
while(i < size){
和j
一样:
j = i;
当j
等于9时,此行将尝试访问数组中的元素j + 1
,它是10,超出范围:
while (inputCopy[j] == inputCopy[j + 1] && j < size){
这将导致未定义的行为。很可能这是你崩溃的根源,counter
的事情是偶然的。
编辑:Aaaaa和你也没有在这一行为inputCopy
分配任何内存,这也将导致未定义的行为:
snprintf(inputCopy, size, "%s", input);
写信给inputCopy
是违法的。它指向随机记忆:
char *inputCopy;
char compressedString[100];
snprintf(inputCopy, size, "%s", input); // !? memory not allocated for the inputCopy