整数增量(++)崩溃应用程序

问题描述 投票:1回答:4

我正在尝试用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++线由于某种原因使我的程序崩溃。我知道这可能很简单,但有人能指出我为什么这不起作用?

c
4个回答
5
投票

你没有为snprintf分配数据。 inputCopy是未初始化的,所以它可能是在写counter使用的内存。确保分配必要的内存。

与此崩溃无关,但您可能会无效读取(inputCopy[j + 1])。切换j < size(j + 1) < size并将它移动到while的开头,这样你就会短路。

如果您使用的是Linux系统,valgrind(或Clang的地址清理程序)可以帮助解决这两个问题。


6
投票

你需要首先检查j < size,并将其加强到j + 1 < size,否则你冒着越界数组访问的风险,这是未定义的行为:

while (j + 1 < size && inputCopy[j] == inputCopy[j + 1]){

(只有当&&为1时,才会评估j + 1 < size的右手参数。)

inputCopy分配的内存在哪里?


3
投票

在这里,您将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);

2
投票

写信给inputCopy是违法的。它指向随机记忆:

char *inputCopy;
char compressedString[100];
snprintf(inputCopy, size, "%s", input); // !? memory not allocated for the inputCopy
© www.soinside.com 2019 - 2024. All rights reserved.