Estoy tratando de escribir un pequeño programa en C pero estoy atascado tratando de incrementar un 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;
}

La línea counter++ por alguna razón está haciendo que mi programa se bloquee. Sé que probablemente sea algo simple, pero ¿alguien puede señalarme por qué esto no funciona?

c
1
Thodoris 4 mar. 2018 a las 23:08

4 respuestas

La mejor respuesta

No está asignando datos para snprintf. inputCopy no está inicializado, por lo que probablemente esté escribiendo sobre la memoria utilizada por counter. Asegúrese de asignar la memoria necesaria.

Sin relación con este bloqueo, pero tiene el potencial de lecturas no válidas (inputCopy[j + 1]). Cambia j < size a (j + 1) < size y muévelo al comienzo de while para que cortocircuites.

valgrind (o el desinfectante de direcciones de Clang) puede ayudar a detectar estos dos problemas si estás en un sistema Linux.

5
Stephen Newell 4 mar. 2018 a las 20:32

Primero debe verificar j < size y fortalecerlo para j + 1 < size, de lo contrario corre el riesgo de un acceso a matriz fuera de los límites, que es un comportamiento indefinido:

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

(El argumento de la derecha de && solo se evalúa si j + 1 < size es 1.)

¿Y dónde está asignada la memoria para inputCopy?

6
Bathsheba 4 mar. 2018 a las 20:10

Aquí define test como una matriz de longitud 10:

char test[10] = "aaaaaaasdd";

Luego lo pasa a compress con 10 como size:

printf("%s \n", compress(test, 10));

Este condicional seguirá siendo verdadero mientras i sea de 0 a 9:

while(i < size){

Y la misma para j:

j = i;

Y cuando j es igual a 9, esta línea intentará acceder al elemento j + 1, que es 10, de su matriz, que está fuera de los límites:

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

Esto causará un comportamiento indefinido. Lo más probable es que esta sea la fuente de su bloqueo, y lo que sucede con counter es incidental.

EDITAR: Aaaaa y tampoco está asignando memoria para inputCopy en esta línea, lo que también conducirá a un comportamiento indefinido:

snprintf(inputCopy, size, "%s", input);
3
Charles Srstka 4 mar. 2018 a las 20:28

Es ilegal escribir en inputCopy. Apunta a la memoria aleatoria:

char *inputCopy;
char compressedString[100];
snprintf(inputCopy, size, "%s", input); // !? memory not allocated for the inputCopy
2
sg7 4 mar. 2018 a las 20:16